Arquivo de 28 de Setembro de 2008
ACE_Task-like em Python
Nos últmos dias me reanimei a voltar a postar nesse blog.
Estou tentando mudar para Python como a minha principal linguagem de script, mas ainda preciso aprender a programar direito nessa linguagem. Enquanto isso não acontece, eu fico replicando código de outros lugares, como a cópia de pobre da ACE_Task abaixo:
import threading, Queue, signal
class Task(object):
def __init__(self):
self.queue = Queue.Queue(0)
def __worker(self):
while True:
item = self.queue.get()
self.process(item)
self.queue.task_done()
def __start(self):
thread = threading.Thread(target=self.__worker)
thread.setDaemon(True)
thread.start()
def activate(self, threads):
for thread in xrange(threads):
self.__start()
signal.signal(signal.SIGINT, signal.SIG_DFL)
def put(self, item):
self.queue.put(item)
def wait(self):
self.queue.join()
def process(self, item):
pass
class task(Task):
def __init__(self, func):
Task.__init__(self)
self.process = func
A única coisa pytônica do código é o decorator do final.
Bom, um exemplo de uso: digamos que você é um spammer e quer mandar vários emails. Você tem um arquivo em que cada linha tem as seguintes informações: servidor; email; subject; mensagem. Tudo separado por ponto e vírgula.
Usando o decorator acima o código ficaria mais ou menos assim (usando 100 threads):
from __future__ import with_statement
from task import task
import smtplib, sys
@task
def send_spam(item):
server, toaddr, subject, msg = item.strip().split(‘;’)
fromaddr = ’spammer@evil.org’
message = (“From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n%s”
% (fromaddr, toaddr, subject, msg))
try:
smtp = smtplib.SMTP(server)
smtp.sendmail(fromaddr, toaddr, message)
except Exception:
pass
def process_file(filename):
send_spam.activate(100)
with open(filename) as file:
map(lambda line: send_spam.put(line), file.readlines())
send_spam.wait()
if __name__ == ‘__main__’:
process_file(sys.argv[1])
Coloquei esse exemplo porque não tinha um melhor… é apenas um exemplo, não um programa de verdade, ok?
Download: task.py
To do: reescrever em Python 2.6 usando Multiprocessos
2 comentários »