python - Python Django 的多线程

标签 python django multithreading decorator python-multithreading

一些功能应该在网络服务器上异步运行。发送电子邮件或数据后处理是典型的用例。

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

相关文章:

python - 高效计算过滤列表的大小

python - Django 用户授权

python - 在 Django 中获取模型表单的保存对象?

java - 如何为 Java 应用程序设计日志结构

python - 使用索引数组中的索引元组索引多维数组 - NumPy/Python

python - 基于多列的运行计数

python - 不返回 YAML 文件的更新并在字符串更新时返回 TypeError

python - Django:是否可以设置 DateInput 小部件的最大和最小日期限制?

python - 限时终止Python进程

java - JNI 线程创建