Как я могу запустить django с mod_wsgi и использовать многопроцессорный модуль? - PullRequest
4 голосов
/ 01 августа 2011

Рабочий процесс, с которым я имею дело (для пользователя), выглядит следующим образом:

  • Пользователь отправляет информацию и файлы с формой
  • Форма сохраняется
  • Выполнена дополнительная обработка после сохранения

Это хорошо, но обработка после сохранения занимает довольно много времени, поэтому я собираюсь сделать это в фоновом режиме и выпустить 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 более волшебный способ сделать это?Джанго ли?Если нет, то как я могу пойти дальше и использовать многопроцессорность?

Ответы [ 2 ]

4 голосов
/ 02 августа 2011

Использование сельдерей .

Среда mod_wsgi может быть многопоточной - в зависимости от вашей конфигурации.Вы не хотите вмешиваться в то, как Apache, mod_wsgi и Django уже используют потоки и процессы для управления пропускной способностью веб-сервера.

Вы должны предположить, что ваша операция Django является однопотоковой и не может ничего делать, кроме ответав Apache как можно быстрее.

3 голосов
/ 02 августа 2011

Ошибка в том, что вы используете старую версию 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.

...