我该如何使用mod_wsgi运行Django并使用multiprocess模块?

4
我正在处理的工作流程(从用户角度来看)如下:
  • 用户使用表格提交信息和文件
  • 表单被保存
  • 进行额外的后处理
虽然这很好,但是后处理需要相当长的时间,因此我想在后台完成它,并发出一个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有更加神奇的方法来解决这个问题吗?如果没有,我该如何使用多进程呢?


1
在线程中运行它,而不是进程。或者使用类似 Celery 的东西。 - Cat Plus Plus
2个回答

4

使用celery

mod_wsgi环境可以是多线程的——这取决于您的配置。您不希望干扰Apache、mod_wsgi和Django已经使用线程和进程来管理Web服务器吞吐量的方式。

您必须假设您的Django操作是单线程的,除了尽可能快地响应Apache之外,不能执行任何其他操作。


3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接