如何使用mod_wsgi运行django并使用多进程模块?

4 投票
2 回答
1884 浏览
提问于 2025-04-16 22:40

我现在处理的工作流程(用户方面)大致是这样的:

  • 用户通过一个表单提交信息和文件
  • 表单被保存
  • 保存后会进行一些额外的处理

这个流程没问题,但保存后的处理花费的时间比较长,所以我想把这个处理放到后台进行,同时给用户发一个HttpResponseRedirect,告诉他们处理正在进行中,请稍后再来查看。不过,似乎这个方法不太奏效;我现在的代码是这样的:

    if form.is_valid():
        p = multiprocessing.Process(target=form.save)
        p.start()
        return HttpResponseRedirect('/running')

但是我收到的错误信息是:

IOError at /content/script/new/
sys.stdout access restricted by mod_wsgi
...
/usr/lib/python2.6/multiprocessing/forking.py in __init__
    # We define a Popen class similar to the one from subprocess, but
    # whose constructor takes a process object as its argument.
    #
    class Popen(object):
        def __init__(self, process_obj):
    >>>>        sys.stdout.flush() ...
            sys.stderr.flush()
            self.returncode = None
            self.pid = os.fork()
            if self.pid == 0:
                if 'random' in sys.modules:
▼ Local vars
Variable    Value
process_obj 
<Process(Process-1, initial)>
self    
<multiprocessing.forking.Popen object at 0xb8a06dec>

Python有没有更简单的方法来实现这个?Django有没有?如果没有,我该如何使用多进程呢?

2 个回答

3

这个错误是因为你使用了一个旧版的mod_wsgi,同时也因为你没有去了解以下内容:

http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Writing_To_Standard_Output http://blog.dscpl.com.au/2009/04/wsgi-and-printing-to-standard-output.html

正如其他人所说的,使用像Celery这样的工具会更好,这样可以在Apache进程之外触发这些操作。

4

使用 celery

mod_wsgi环境可以支持多线程,这取决于你的配置。你不想干扰Apache、mod_wsgi和Django已经在使用线程和进程来管理网络服务器的工作方式。

你需要假设你的Django操作是单线程的,不能做其他事情,只能尽快响应Apache的请求。

撰写回答