Python Djang的多线程处理

2024-05-14 08:23:00 发布

您现在位置:Python中文网/ 问答频道 /正文

有些函数应该在web服务器上异步运行。发送电子邮件或数据后处理是典型的用例。

编写decorator函数以异步运行函数的最佳(或最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

Tags: 数据函数服务器web电子邮件defargsfunction
3条回答

我继续在规模和生产中使用这个实现,没有任何问题。

装饰定义:

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

随着时间的推移,堆栈已经更新和转换,没有失败。

最初是Python2.4.7,Django 1.4,Gunicorn 0.17.2,现在是Python3.6,Django 2.1,女招待1.1。

如果您正在使用任何数据库事务,Django将创建一个新连接,需要手动关闭该连接:

from django.db import connection

@postpone
def foo():
  #do stuff
  connection.close()

Celery是异步任务队列/作业队列。它有很好的记录,非常适合你的需要。我建议你开始here

在Django中,最常用的异步处理方法是使用Celery^{}

相关问题 更多 >

    热门问题