Alisson Machado
11 October 2016

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:

#!/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:

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).


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.


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:


#!/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.