一些功能应该在网络服务器上异步运行。发送电子邮件或数据后处理是典型的用例。
编写装饰器函数以异步运行函数的最佳(或最 Pythonic)方法是什么?
我的设置很常见:Python、Django、Gunicorn 或 Waitress、AWS EC2 标准 Linux
例如,这是一个开始:
from threading import Thread
def postpone(function):
def decorator(*args, **kwargs):
t = Thread(target = function, args=args, kwargs=kwargs)
t.daemon = True
t.start()
return decorator
期望的用法:
@postpone
def foo():
pass #do stuff
最佳答案
我继续在规模和生产中使用此实现,没有任何问题。
装饰器定义:
def start_new_thread(function):
def decorator(*args, **kwargs):
t = Thread(target = function, args=args, kwargs=kwargs)
t.daemon = True
t.start()
return decorator
示例用法:
@start_new_thread
def foo():
#do stuff
随着时间的推移,堆栈不断更新和转换。
最初是 Python 2.4.7、Django 1.4、Gunicorn 0.17.2,现在是 Python 3.6、Django 2.1、Waitress 1.1。
如果你正在使用任何数据库事务,Django 将创建一个新的连接,这需要手动关闭:
from django.db import connection
@postpone
def foo():
#do stuff
connection.close()
关于python - Python Django 的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18420699/