(blog ‘lucindo)

um dia eu aprendo a programar

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? :-P

Download: task.py

To do: reescrever em Python 2.6 usando Multiprocessos



 | Enviar por e-mail  | Hits para esta publicação: 915

2 respostas para “ ACE_Task-like em Python ”

  1. Leonardo Varuzza Setembro 28th, 2008 23:29

    Eu também estou pensando em usar o python como linguagem de scripts. Minha dúvida é entre o python e o ruby. O python possui uma grande quantidade de bibliotecas científicas, gráficas, GUI’s, etc. Porém na primeira aplicação que eu tentei fazer me deparei com a falta de uma biblioteca de SOAP que funcionasse com o serviço que eu estou interessado. Tudo bem que SOAP parece ser um protocolo from hell, porém seria algo prático para a aplicação qeu eu queria fazer.

    Existem duas bibliotecas de SOAP para python, o SOAPpy que não funcionou no python 2.5 e a ZSI que é mal documentada e se recusou a funcionar com o servidor que eu queria. Pois vejam que não é só o Common Lisp que tem problemas de bibliotecas abandonadas e sem documentação.

  2. Lucindo Setembro 28th, 2008 23:40

    Eu também tinha essa dúvida entre python e ruby. Quase me decidi por ruby, que como linguagem é até mais abrangente que python (para quem está acostumado com Lisp). Mas tive experiências muito ruins com ruby e percebi que, mesmo para scripts, não é madura e a sua comunidade está repleta de amadores.

Deixe uma resposta.