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

时间:2011-08-01 19:46:23

标签: python django mod-wsgi multiprocessing

我正在处理的工作流程(用户方式)如下所示:

  • 用户使用表单
  • 提交信息和文件
  • 表单已保存
  • 其他保存后处理已完成

这很好,但保存后的处理需要很长时间,因此我希望在后台执行此操作并向消息发出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 个答案:

答案 0 :(得分:4)

使用celery

mod_wsgi环境可以是多线程的 - 具体取决于您的配置。您不希望干扰Apache,mod_wsgi和Django如何使用线程和进程来管理Web服务器吞吐量。

您必须假设您的Django操作是单个线程,除了尽快响应Apache之外无法执行任何操作。

答案 1 :(得分: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进程之外触发这些东西。