相关疑难解决方法(0)

Django长期运行线程/处理的异步任务

免责声明:我知道SO上有几个类似的问题.我想我读的大多数,如果不是全部,但没有找到我真实问题的答案(见后文).我也知道使用celery或其他异步队列系统是实现长时间运行任务的最佳方法 - 或者至少使用cron管理的脚本.还有关于进程和线程的mod_wsgi文档,但我不确定我是否正确.

问题是:

使用其中列出的解决方案涉及哪些确切的风险/问题?它们中的任何一个都适用于长时间运行的任务(好吧,即使芹菜更适合)?我的问题更多是关于理解wsgi和python/django的内部结构,而不是找到最好的整体解决方案.阻塞线程,不安全访问变量,僵尸处理等问题.

让我们说:

  1. 我的"long_process"正在做一些非常安全的事情.即使它失败了我也不在乎.
  2. python> = 2.6
  3. 我在守护进程模式下使用带有apache的mod_wsgi(用uwsgi或gunicorn会有什么变化吗?)

mod_wsgi conf:

WSGIDaemonProcess NAME user=www-data group=www-data threads=25
WSGIScriptAlias / /path/to/wsgi.py
WSGIProcessGroup %{ENV:VHOST}
Run Code Online (Sandbox Code Playgroud)

我认为这些是可用于启动单独进程(在广义上意味着)的选项,以便在快速返回对用户的响应的同时执行长时间运行的任务:

os.fork

import os

if os.fork()==0:
    long_process()
else:
    return HttpResponse()
Run Code Online (Sandbox Code Playgroud)

import subprocess

p = subprocess.Popen([sys.executable, '/path/to/script.py'], 
                                    stdout=subprocess.PIPE, 
                                    stderr=subprocess.STDOUT)
Run Code Online (Sandbox Code Playgroud)

(脚本可能是manage.py命令)

线程

import threading

t = threading.Thread(target=long_process,
                             args=args,
                             kwargs=kwargs)
t.setDaemon(True)
t.start()
return HttpResponse()
Run Code Online (Sandbox Code Playgroud)

NB.

由于Global Interpreter Lock,在CPython中只有一个线程可以同时执行Python代码(即使某些面向性能的库可能会克服此限制).如果您希望应用程序更好地使用多核计算机的计算资源,建议您使用多处理.但是,如果要同时运行多个I/O绑定任务,则线程仍然是一个合适的模型.

主线程将快速返回(httpresponse).产生的长线程是否会阻止wsgi为其他请求做其他事情?!

from multiprocessing import Process

p = Process(target=_bulk_action,args=(action,objs))
p.start()
return HttpResponse()
Run Code Online (Sandbox Code Playgroud)

这应该解决线程并发问题,不应该吗?


所以这些是我能想到的选择.什么会起作用,什么不起作用,为什么?

django asynchronous mod-wsgi

30
推荐指数
2
解决办法
2万
查看次数

使用Django长时间运行任务

我的目标是创建一个能够执行持久的主要系统任务的应用程序,例如:

  • 从存储库中检出代码,
  • 在各种本地化之间复制目录,
  • 等等

问题是我需要以某种方式独立于Web浏览器进行准备.我的意思是,例如在开始结账/复制操作后,关闭Web浏览器不会中断操作.所以回到那个网站后,我可以看到复制继续进行或者在浏览器关闭时启动了另一个操作......

我正在搜索各种工具,如RabbitMQ + Celery,Twisted,Pyro,XML-RPC,但我不知道这些工具是否适合我.有没有人在创建Django应用程序时遇到类似的需求?如果有任何我应该知道的方法/包,请告诉我.代码示例也将非常受欢迎!

提前感谢您的建议!

(抱歉我的英语不好.我正在努力.)

django process

11
推荐指数
2
解决办法
3586
查看次数

在Django长期投票

我在我的Django应用程序中使用了一种长轮询,以便在客户端进行过程中向客户端返回有关长操作的状态消息.我通过在我的视图函数中返回一个HttpResponse对象来实现这一点,该函数使用返回字符串的迭代器进行初始化.这一切都很好,但是迭代器函数变得非常长,有大量的收益来返回状态消息.

我想通过将长操作分成多个函数来更好地构建这个函数,每个函数都返回自己的状态消息.但我看不到这样做的方法.换句话说,我有这个:

def my_long_operation():
  do_something()
  yield "Did something"
  do_something_else()
  yield "Did something else"
Run Code Online (Sandbox Code Playgroud)

......我希望:

def do_something():
  do_first_part_of_something()
  yield "Did first part of something"
  do_second_part_of_something()
  yield "Did second party of something"

def do_something_else():
  do_first_part_of_something_else()
  yield "Did first part of something else"
  do_second_part_of_something_else ()
  yield "Did second party of something else"

def my_long_operation():
  do_something()
  do_something_else()
Run Code Online (Sandbox Code Playgroud)

有没有办法让第二个例子中的yield得到迭代器调用者的值?如果没有,是否有更好的方法?我查看了WebSockets但它似乎还没有完全出炉(特别是在浏览器支持方面).我还考虑了对服务器进行真正的轮询,但这会更加复杂,所以我希望继续保持开放连接并尽可能地传输消息.

python django long-polling

5
推荐指数
1
解决办法
2900
查看次数

标签 统计

django ×3

asynchronous ×1

long-polling ×1

mod-wsgi ×1

process ×1

python ×1