2012-04-04 30 views
11

Tôi cần gửi thư từ ứng dụng Flask đơn giản của mình, vì vậy tôi nghĩ cách đơn giản nhất là gửi nó bằng smtplib. Nhưng tôi phải làm điều đó một cách không đồng bộ - bạn không thể chỉ cần chèn 3 giây trễ vào yêu cầu - đúng không? Vì vậy, tôi thêm email vào một hàng đợi (bảng psql), và gửi nó từ một chương trình khác mà đọc bảng này và sử dụng smptlib.Cách thích hợp để chạy một số mã Python không đồng bộ là gì?

Chương trình thứ hai (maildonkey) này hoạt động như một quá trình riêng biệt, trong một dịch vụ mới nổi độc lập.

Bây giờ tôi cần một dịch vụ asynchoronous khác, và tôi đang nghĩ nếu tôi nên viết một tập lệnh python khác (thứ ba, đếm ứng dụng Flask và 'maildonkey') hoặc tôi nên sử dụng cái gì đó như 'multiprocess' của Python, hoặc thậm chí là 'chủ đề' và viết lại chương trình thứ hai?

(Khi tôi đã được lập trình trong Clojure, tôi có thể dễ dàng chạy mã trong một thread riêng biệt với 'tương lai', vì vậy thường tôi sẽ làm điều đó.)

+0

Là đậm cần thiết? – Blender

Trả lời

9

Bạn nên xem xét sử dụng Celery. Nó được sử dụng rất rộng rãi trong các khung công tác web để xử lý không đồng bộ và hỗ trợ rất nhiều phần phụ trợ khác nhau như AMQP, cơ sở dữ liệu, v.v.

+1

Cảm ơn, nhưng tôi nghĩ rằng điều này sẽ là quá mức cần thiết cho những điều đơn giản như vậy - tôi đã có một hệ thống làm việc và giới thiệu một thành phần mới sẽ chỉ làm tăng sự phức tạp của nó - xem http://teddziuba.com/2011/02/the-case-against -queues.html. Tôi quan tâm đến việc giải quyết nó và đơn giản hóa nó cùng một lúc. – Hugo

10

Hãy thử Gevent.
Bạn có thể tạo đối tượng Greenlet cho nhiệm vụ dài của mình.
Greenlet này là 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]) 

Ngoài ra bạn có thể sử dụng như một Gevent server cho Flask:

from gevent.wsgi import WSGIServer 
from yourapplication import app 

http_server = WSGIServer(('', 5000), app) 
http_server.serve_forever() 
Các vấn đề liên quan