What's the proper way to run some Python code asynchronously?

ぐ巨炮叔叔 提交于 2019-12-04 08:31:37

问题


I needed to send mail from my plain Flask app, so I thought the simplest way would be to send it using smtplib. But I had to do it asynchronously - you can't just insert a 3 second delay into the request - right? So I add the email to a queue (psql table), and send it from another program that reads this table and uses smptlib.

This second program (maildonkey) is running as a separate process, in an independent upstart service.

Now I need another one of those little asynchoronous services, and I'm thinking if I should write another python script (third, counting my Flask app and 'maildonkey') or should I use something like Python's 'multiprocess', or even 'threads' and rewrite the second program?

(When I was programming in Clojure, I could easily run code in a separate thread with 'futures', so normally I would do that.)


回答1:


You should consider using Celery. It is very widely used in web frameworks for asynchronous processing and supports a lot of different backends like AMQP, databases etc.




回答2:


Try Gevent.
You can create Greenlet object for your long task.
This greenlet is green thread.

from gevent import monkey
monkey.patch_all()
import gevent
from gevent import Greenlet

class Task(Greenlet):
    def __init__(self, name):
        Greenlet.__init__(self)
        self.name = name    
    def _run(self):
        print "Task %s: some task..." % self.name

t1 = Task("long task")
t1.start()
# here we are waiting task
gevent.joinall([t1])

Also you can use Gevent as a server for Flask:

from gevent.wsgi import WSGIServer
from yourapplication import app

http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()


来源:https://stackoverflow.com/questions/10003933/whats-the-proper-way-to-run-some-python-code-asynchronously

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!