m2ti - python brasil

29
Python Brasil [5] Modelo de Programação com Threads e Transações Implícitas em Python Rodrigo Hübner

Upload: rodrigo-huebner

Post on 09-Jul-2015

1.546 views

Category:

Technology


1 download

DESCRIPTION

Apresentação feita no 5º Encontro Brasileiro da comunidade Python

TRANSCRIPT

Page 1: M2ti - Python Brasil

Python Brasil [5]

Modelo de Programação com Threads e Transações Implícitas em Python

Rodrigo Hübner

Page 2: M2ti - Python Brasil

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

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

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 multi­thread já existentes;

Aplicar estratégias existentes e buscar novas idéias

Page 5: M2ti - Python Brasil

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

Programação paralela em Python

Bibliotecas tradicionais:

threading

multiprocessing

Com mecanismos para SMP e Clusters

PP – Parallel Python

Page 7: M2ti - Python Brasil

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

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

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

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

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

Novo módulo em Python baseado na API OpenMP

API para programação paralela baseada em multi­processamento, 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

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

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

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

@task: Funcionamento usando 2 cpu

Page 17: M2ti - Python Brasil

@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

@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

@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

@task: Funcionamento usando 2 cpu com roubo de tarefas

Page 21: M2ti - Python Brasil

@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

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

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

Explicit is better than implicit.

Page 25: M2ti - Python Brasil

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

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.mems­exchange.org/software/durus/;

Page 27: M2ti - Python Brasil

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

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?

Page 29: M2ti - Python Brasil

@final

Perguntas?

Rodrigo Hübnere-mail:[email protected]