M2ti - Python Brasil
-
Upload
rodrigo-huebner -
Category
Technology
-
view
1.546 -
download
1
description
Transcript of M2ti - Python Brasil
![Page 1: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/1.jpg)
Python Brasil [5]
Modelo de Programação com Threads e Transações Implícitas em Python
Rodrigo Hübner
![Page 2: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/2.jpg)
Conteúdo
● Introdução
● Motivação
● Programação paralela implícita
● Algumas estratégias já utilizadas
● Principais módulos para programação
paralela em Python
● Estratégia proposta para Python
● A expansão (Pré-processamento)
● Conclusões e trabalhos futuros
![Page 3: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/3.jpg)
Introdução
Nos modelos atuais, o programador deve solicitar a criação de unidades paralelas explicitamente.
Tais modelos tornam a programação complexa para:
Criar
Gerenciar
Explorar a arquitetura
A proposta é criar unidades paralelas de forma implícita.
![Page 4: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/4.jpg)
Motivação
Facilitar a construção de programas paralelos;
Explorar programação paralela em alguma linguagem;
Expandir uma linguagem de programação baseado em modelos multithread já existentes;
Aplicar estratégias existentes e buscar novas idéias
![Page 5: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/5.jpg)
Modificar um compilador/interpretador já existente
Qualquer resultado positivo é válido e inquestionável.
Contras:
Difícil implementação para linguagens já existentes;
Resultados demoram;
Não existe linguagens que implentam unidades paralelas de forma implícita para tomar base.
![Page 6: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/6.jpg)
Programação paralela em Python
Bibliotecas tradicionais:
threading
multiprocessing
Com mecanismos para SMP e Clusters
PP – Parallel Python
![Page 7: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/7.jpg)
Python - threading
Método mais utilizado até o momento;
É um módulo completo, mas possuem problemas de desempenho...;
Threads utilizam o mesmo espaço de endereçamento;
Soluções: uso de locks...
GIL Global Interpreter Lock
![Page 8: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/8.jpg)
Python – threading. Exemplo de código
from threading import Thread
def func(arg):
print(arg)
th = Thread(target=func, args=('executando thread', ) )
th.start()
th.join()
![Page 9: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/9.jpg)
Python - multiprocessing
É similar ao módulo threading;
Oferece paralelismo local e remoto;
Evita problemas com o GIL usando subprocessos em vez de threads;
Shared memory e objetos ctypes compartilhados
Managers Queues, Pipes...
![Page 10: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/10.jpg)
Python – threading. Exemplo de código
from multiprocessing import Process
def func(arg):
print(arg)
p = Process(target=func, args=('executando subprocesso', ) )
p.start()
p.join()
![Page 11: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/11.jpg)
Python – threading. Exemplo de código
Além disso...
from multiprocessing import Pool
def f(x): return x*x
if __name__ == '__main__': pool = Pool(processes=4) result = pool.apply_async(f, [10]) print(pool.map(f, range(10)))
![Page 12: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/12.jpg)
Novo módulo em Python baseado na API OpenMP
API para programação paralela baseada em multiprocessamento, para linguagens C, C++ e Fortran;
Base inicial para a construção de um módulo em Python:
Exemplos:
int main(int argc, char* argv[]) { #pragma omp parallel printf("Hello, world.\n"); return 0; }
int main(int argc, char **argv) { const int N = 100000; int i, a[N]; #pragma omp parallel for for (i = 0; i < N; i++) a[i] = 2 * i; return 0;}
![Page 13: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/13.jpg)
Estratégias para a criação do módulo em Python
from multiprocessing import Pool
@Pool(5, 'apply')
def func()
…
Depende de parâmetros
>>> Criar um módulo que possa enviar parâmetros através de chamadas da função decorada
![Page 14: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/14.jpg)
Estratégias para a criação do módulo em Python
multiprocessing + @decorator = @task
@taskdef soma_primos(n): …
soma_primos(1000)
Outros módulos: inspect, atexit, …
![Page 15: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/15.jpg)
Python – decorators
class decorador(object): def __init(self, func): self.func = func def __call__(self, *args, **kargs): self.func(*args, **kargs)
@decoradordef foo(arg): print(arg)
foo()
![Page 16: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/16.jpg)
@task: Funcionamento usando 2 cpu
![Page 17: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/17.jpg)
@task: Exemplo de código
for m2ti import task
@taskdef fibonacci(n): a, b = 0, 1 for i in range(n) a, b = b, a+b return a
for i in range(1000): fibonacci(i)
![Page 18: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/18.jpg)
@task: Acrescentando init e final
@init decora uma tarefa que será executada antes de todos os trabalhadores;
Permite preparar objetos que serão utilizados pelas tarefas. Ex: Construção de uma matriz
@final decora uma tarefa que será executada depois que todos os trabalhadores terminarem suas execuções;
Imprimir resultados, especificar outro conjunto de tarefas, etc.
![Page 19: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/19.jpg)
@task: Acrescentando init e final. Exemplo de código
from m2ti import task, init, final
@initdef primeira(): …
@taskdef func(arg): ...
@finaldef ultima(): ...
for n in range(100): func(arg)
![Page 20: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/20.jpg)
@task: Funcionamento usando 2 cpu com roubo de tarefas
![Page 21: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/21.jpg)
@task(n): Exemplo de código
from m2ti import task_cilk
@task(1)def foo(arg): ...
@task(2)def bar(arg): … foo(10) ...
bar(10)...bar(100)…
for n in range(100): foo(n)
![Page 22: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/22.jpg)
Pré-processamento do código fonte
Possibilidade de acrescentar novas idéias;
Permite inserir melhor o código depois de préprocessar;
É possível explorar melhor as funcionalidades da linguagem e suas bibliotecas...
![Page 23: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/23.jpg)
Pré-processamento - exclusive
Transformação simples a partir de locks
import multiprocessing...lock = multiprocessing.Lock()lock.acquire()a += 1lock.release()
exclusive: a += 1
![Page 24: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/24.jpg)
Explicit is better than implicit.
![Page 25: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/25.jpg)
Pré-processamento - barrier
Implementação de sincronização através de barreiras
Eventos e trabalhadores ativos estariam implícitos
Não existe implementação de barreira no módulo multiprocessing;
Exemplo:…@taskdef func(arg): … barrier ...
![Page 26: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/26.jpg)
Pré-processamento - atomic
Implementação de transações implícitas: Modo mais seguro de manipular objetos compartilhados;
Projetos existentes:
Kamaelia http://www.kamaelia.org/STM
Durus http://www.memsexchange.org/software/durus/;
![Page 27: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/27.jpg)
Pré-processamento - atomic
Adapatar para funcionar junto ao módulo multiprocessing
Deixar com uma sintaxe mais pythonica :)
Exemplo: def foo(): …
def bar(): …
atomic: a = foo() b = bar() c = a + b...
![Page 28: M2ti - Python Brasil](https://reader033.fdocumentos.tips/reader033/viewer/2022052623/559e5a651a28ab77708b458c/html5/thumbnails/28.jpg)
Conclusões e Trabalhos Futuros
Existem muitas limitações;
Resultados bons para alguns casos;
Verificar agora o que é mais importante;
Módulo ou préprocessamento?
Outras idéias?