我使用djutils @async
装饰器异步调用函数。当我使用标准./manage.py runserver
命令启动我的服务器时,这很有效。但是当我在gunicorn下运行我的django应用程序并且我用@async装饰器调用该函数时根本没有任何事情发生...
我研究了djutils异步装饰器的代码,它添加并反对python标准的Queue,并产生一个或多个线程来使用队列。
任何一个想法或暗示我应该在哪里看下一步,让我的@async功能在gunicorn中运行? gunicornn是否正在改变python线程实现的标准实现?
答案 0 :(得分:1)
Python线程受到全局解释器锁的干扰,而Gunicorn很可能会修补默认的线程行为。所以你可以尝试改变它的工人类型。如果您的Gunicorn配置为使用Gevent的异步工作程序,那么它可能会修补Thread,因为Gevent可以做到这一点,用一个合作的“绿色”线程替换线程类。
就我个人而言,我讨厌“以不同的方式做”答案,所以很抱歉给予答案。不要从Web服务器的进程中生成线程或fork进程。只需将该工作卸载到后台队列。
如果您有简单的需求,建立自己的后台队列很容易。在数据库中有一个表记录挂起和已完成的作业,并结合每5分钟左右执行一次的cron脚本并在那里工作。
如果你想要一些稳定且可以扩展的东西,Celery非常好。
答案 1 :(得分:0)
当gunicorn首次启动时,用于启动处理队列中项目的线程的代码(在djutils / decorators.py中),即为gunicorn进程调用它。然而,gunicorn将分叉多个工作进程。这样做时,不会重新调用启动线程的代码。因此,这些后台主题只出现在高手枪工艺中,而不是任何枪炮工作流程。