Python Threads

Esse é um post breve para mostrar um exemplo sobre o uso de Threads em Python.

Threads são uma forma de fazer com que a sua aplicação execute tarefas de forma assíncrona, por exemplo, enquanto uma estrutura de repetição é executada você pode executar uma outra rotina.

Um exemplo seria uma Daemon de um serviço do sistema operacional, como por exemplo o Apache. O Apache é um servidor Web que quando iniciado cria processo principal que espera por conexões do tipo HTTP, no momento em que uma requisição é recebida, ele inicia um subprocesso que responde para o cliente e o processo principal continua aguardando por novas requisições, por este motivo é possível responder a centenas de conexões simultaneamente.

A linguagem Python já vem com um módulo nativo para fazer o uso de Threads, o nome desse módulo é threading.

Para fazer a importação dele é necessário adicionar a seguinte instrução no seu script:

1
2
3
4
#!/usr/bin/python 
 
import threading
import time

Estou importando também o módulo time para mostrar a função que será executada em segundo plano.

A partir disso você pode criar uma função qualquer, como o exemplo abaixo:

1
2
3
4
def worker(message):
    for i in range(5):
       print message
       time.sleep(1)

Basicamente essa função espera uma mensagem como parâmetro e essa mensagem será executada 5 vezes em intervalos de 1 segundo, esse intervalo foi definido com a instrução time.sleep(1).

1
2
t = threading.Thread(target=worker,args=("thread sendo executada",))
t.start()

As linhas acima fazem a instância de uma thread e a execução dessa thread.

Na primeira linha é criado o objeto t que espera dois parâmetros, sendo o primeiro deles o target que é o nome de uma função do seu script, no nosso caso a função worker, esse parâmetro é obrigatório. O segundo parâmetro é opcional, ele se refere aos argumentos que serão passados para a função que será executada em segundo plano, o parâmetro args espera como argumento uma tupla com os valores da função.

1
2
3
4
5
6
while t.isAlive():
    print "Aguardando thread"
    time.sleep(5)
 
print "Thread morreu"
print "Finalizando programa"

Nesse último trecho de código é criado uma estrutura de repetição while e a condição que ela recebe é se a thread t ainda está sendo executada, caso esteja, será retornado o valor True então o bloco de código do while é executado, caso seja False significa que a thread já terminou e então serão executadas as instruções após o while.

O script completo ficou da seguinte forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/python
 
import threading
import time
 
def worker(message):
    for i in range(5):
        print message
        time.sleep(1)
 
 
t = threading.Thread(target=worker,args=("thread sendo executada",))
t.start()
while t.isAlive():
    print "Aguardando thread"
    time.sleep(5)
 
print "Thread morreu"
print "Finalizando programa"

Qualquer dúvida, tamo ae \o.

6
Deixe um comentário

avatar
4 Comment threads
2 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
5 Comment authors
Alisson MachadodanielTonimRafhael AlvesMisael Recent comment authors
  Subscribe  
newest oldest most voted
Notify of
Misael
Visitante
Misael

Obrigado. Muito bem explicado.

Rafhael Alves
Visitante
Rafhael Alves

Bom dia,

No caso da “worker” retornar algum valor ou uma exception como ficaria com a Thread?

Tonim
Visitante
Tonim

Muito bom!

daniel
Visitante
daniel

Olá. Tentei implementar o código usando os threads para controlar um motor de passo e a câmera junto e não está funcionando. Os dois programas rodam sem problemas separados, mas quando eu implemento através de funções com os threads a câmera ainda liga mas o motor de passo não anda. Será que pode me ajudar? Obrigado.