15 de ago de 2012

Python - Usando o módulo threading


Definição de Thread:
     Thread = Linha ou encadeamento de execução, é uma forma de processo que se divide em duas ou mais vezes para executar uma tarefa. Ex: em um jogo um thread pode executar os gráficos e outro o aúdio, onde o usuário percebe sua execução simultanea em tempo real. Um dos seus benefícios é que se um thread ficar parado (em estado de bloqueio) à espera de algum dispositivo de entrada/saída, um outro thread que estava na fila de espera entra em execução.
     Um thread não é um programa, mas executa dentro do programa. É possível executar vários threads em um único programa (multithread):

Módulo threading:
     No Python, o módulo nativo para executar os threads é o Thread. Ele é interpretado por sistemas que suportem o posix threads (pthreads). O módulo Threading é uma interface de alto nível para utilização de threads. Esse módulo permite que os thread sejam executados de uma maneira mais fácil.


Primeiro Exemplo:
     Para iniciar um novo thread, é preciso chamar o seguinte método disponível no módulo thread:  
thread.start_new_thread (funcao, args)
* funcao = função que vc criou.
* args = tupla com os argumentos da função. 

Exemplo 01:

     O exemplo acima vai retornar isso:

Thread-1: Tue Aug 14 18:42:49 2012
Thread-1: Tue Aug 14 18:42:51 2012
Thread-2: Tue Aug 14 18:42:51 2012
Thread-1: Tue Aug 14 18:42:53 2012
Thread-2: Tue Aug 14 18:42:55 2012
Thread-1: Tue Aug 14 18:42:55 2012
Thread-1: Tue Aug 14 18:42:57 2012
Thread-2: Tue Aug 14 18:42:59 2012
Thread-2: Tue Aug 14 18:43:03 2012
Thread-2: Tue Aug 14 18:43:07 2012


Determinando os Threads: 
     Podemos usar argumentos para nomear os threads para ficar mais organizado. O módulo logging permite a nomeação dos threads através do código: %(threadName)s. Nomear os threads facilita a visualização do retorno das mensagens.

Exemplo 02:
Retorno:
[DEBUG] (Thread-1-Som) Iniciando
[DEBUG] (Thread-2-Imagem) Iniciando
[DEBUG] (Thread-3-Imagem) Iniciando
[DEBUG] (Thread-2-Imagem) Finalizando
[DEBUG] (Thread-3-Imagem) Finalizando
[DEBUG] (Thread-1-Som) Finalizando



Módulo Queue:
     Esse módulo é usado quando muita informação precisa ser trocada com segurança pelos threads. As informações ficam guardadas no objeto Queue e os threads podem tirar eles quando for necessário.

Exemplo 03:

Vai retornar:
Nova tarefa: Prioridade media
Nova tarefa: Prioridade baixa
Nova tarefa: Prioridade alta
Processando tarefa: Prioridade alta
Processando tarefa: Prioridade media
Processando tarefa: Prioridade baixa

 


     No exemplo acima foi utilizado a classe Queue.priorityQueue, que usa o tipo de ordem dos elementos do queue para decidir qual recuperar. As tarefas vão ser executadas pela ordem de prioridade do queue na hora que o get() for chamado.

Exemplo prático usando o módulo Threading:
     Para implementar um novo thread usando o módulo Threading é preciso:
-Definir uma nova subclasse da classe Thread.
- Reescrever o método __init__(self,[args]).
- Reescrever o método run(self,[args]) para implementar o que o thread deve fazer quando iniciado.
      Depois de criado a nova subclasse, você pode criar uma nova instância e iniciar um novo thread pelos métodos start() e run().
     O uso dos threads facilita a execução de várias tarefas ao mesmo tempo. Vamos supor que você queira verificar a disponibilidade de vários computadores na rede usando o ping. Um script python que não usa threads levaria em torno de 28 segundos para pingar 10 hosts em sequência. Com o uso dos threads levaria 2 segundos.

Exemplo 04:

Retorno:
Wed Aug 15 18:14:18 2012
Status do  127.0.0.60 - Ativo
Status do  127.0.0.61 - Ativo
Status do  127.0.0.62 - Ativo
Status do  127.0.0.63 - Ativo
Status do  127.0.0.64 - Ativo
Status do  127.0.0.65 - Ativo
Status do  127.0.0.66 - Ativo
Status do  127.0.0.67 - Ativo
Status do  127.0.0.68 - Ativo
Status do  127.0.0.69 - Ativo
Wed Aug 15 18:14:20 2012


     Depois que todos os processos foram iniciados, as respostas são exibidas de uma só vez através do join(). Após a execução dos 10 pings, o código espera eles terminarem pela ordem que foram iniciados. 

* Fontes:
http://www.tutorialspoint.com/python/python_multithreading.htm
http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/threads/threads1.html
http://pt.wikipedia.org
http://www.doughellmann.com/PyMOTW/threading/ 
http://medeubranco.wordpress.com/2008/07/10/threads-em-python/ 
http://www.wellho.net/solutions/python-python-threads-a-first-example.html/
http://www.doughellmann.com/PyMOTW/Queue/index.html#module-Queue

1 comentários:

Binary Codec disse...

Me ajudou bastante! valeu!

Postar um comentário