Image Image Image Image Image
Scroll to Top

Topo

Queue

31

jan
2012

Sem Comentários

Em Blog
Python

Por Allison

Como Trabalhar com Threads em Python

Em 31, jan 2012 | Sem Comentários | Em Blog, Python | Por Allison

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.

Tags | , , ,