Fonte: Rafael Cirolini/NerdHead
Precisei criar um programa (futuramente vou colocar ele aqui) que precisava testar 290 links de uma pagina para saber se eles estavam ok. O teste era simples, tentar conectar e esperar um 200 OK da resposta do servidor para verificar se não havia problema.
O problema consistia que o teste deveria ser razoavelmente rápido, e fazendo os testes de forma sequenciais demorava em torno de 16 minutos, o que não era aceitável. Uma solução foi a criação de threads para paralelizar o trabalho. Foi difícil achar alguma documentação que explique de forma simples o que eu precisava fazer, que era disparar o maior numero de processos simultâneos, aguardar eles terminarem e fazer diversas verificações.
Bom, aqui pretendo demonstrar de maneira bem simples como criar uma fila (queue), e criar threads para consumi-la.
#imports necessários import random from time import sleep from Queue import * from threading import Thread, Lock #função para consumir a fila def consumir(): job = queue.get() #pega o primeiro job livre sleep(random.randint(1,3)) #espera print "Estou consumindo o job: %s"%(job) queue.task_done() #finaliza o job #gera a fila e coloca todos os links na fila queue = Queue() jobs = 0 while jobs < 10: print "Colocando o job %s na fila"%(jobs) queue.put(jobs) jobs = jobs + 1 print "A fila tem %s jobs"%(queue.qsize()) #enquanto tiver fila cria uma tread i = 0 while i < queue.qsize(): th = Thread(target=consumir) th.setDaemon(True) th.start() #espera a fila ser consumida para saber se esta com algum erro queue.join() print "Finalizou"
A saída deve ser algo mais ou menos assim:
Colocando o job 0 na fila
Colocando o job 1 na fila
Colocando o job 2 na fila
Colocando o job 3 na fila
Colocando o job 4 na fila
Colocando o job 5 na fila
Colocando o job 6 na fila
Colocando o job 7 na fila
Colocando o job 8 na fila
Colocando o job 9 na fila
A fila tem 10 jobs
Estou consumindo o job: 9
Estou consumindo o job: 1
Estou consumindo o job: 4
Estou consumindo o job: 6
Estou consumindo o job: 0
Estou consumindo o job: 2
Estou consumindo o job: 3
Estou consumindo o job: 5
Estou consumindo o job: 7
Estou consumindo o job: 8
Finalizou
Usei o random e o sleep somente para mostrar que os jobs são consumidos de maneira assíncrona e que não esperam um pelo outro para serem consumidos.