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: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.
[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.
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().
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:
Exemplo 04:
Retorno:
Wed Aug 15 18:14:18 2012Status 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:
Como seria um exemplo de uma thread pai criar thread filha?
Postar um comentário