2012-01-27 2 views
0

Итак, у меня есть простой скрипт cgi python. Веб-интерфейс используется для добавления материала в базу данных, и у меня есть функция update(), которая выполняет некоторую очистку.python web thread

Я хочу запускать функцию update() каждый раз, когда что-то добавляется на сайт, но это должно быть в фоновом режиме. То есть веб-страница должна завершить загрузку, не дожидаясь завершения функции update().

Сейчас я использую:

-add stuff to db 
Thread(target=update).start() 
-redirect to index page 

Проблема, кажется, что питон не хочет, чтобы завершить запрос (перенаправлять) до обновления() поток выполняется.

Любые идеи?

+0

Покажите нам код. – Marcin

+1

Это может быть за пределами того, что может сделать CGI - вам может потребоваться более продвинутая настройка, такая как WSGI. (Может быть, я ошибаюсь) –

ответ

1

То есть веб-страница должна завершить загрузку без ожидания функции обновления(), чтобы закончить

CGI должен ждать процесса - в целом - до конца. Темы не полезны.

У вас есть три варианта.

  1. subprocess. Создайте отдельный подпроцесс «нет ожидания» для обновления. Предоставьте всю информацию в качестве параметров командной строки.

  2. multiprocessing. Попросите свой CGI-подключение разместить запрос на работу в очереди. Вы должны запустить отдельный прослушиватель, который обрабатывает запросы на обновление из очереди.

  3. celery. Загрузите Celery и используйте его для управления отдельным рабочим процессом, который выполняет фоновую обработку.

+0

Спасибо, не могли бы вы объяснить, как реализовать вариант 1.? – breez

+0

Это кажется совершенно ясным. http://docs.python.org/library/subprocess.html#replacing-the-os-spawn-family Существует множество проблем с переполнением стека о подпроцессе. Вы попробовали «Поиск»? Какие ** конкретные ** вопросы у вас есть? –

+0

Подпроцесс не работает в Windows. – breez

0
  • можно добавить триггер базы данных для обновления БД в ответ на событие, например, если конкретный столбец изменился
  • начать подпроцесс, например, subprocess.Popen([sys.executable, '-c', "from m import update; update()"]). Она не может работать в зависимости от вашей CGI среды
  • или просто прикоснуться update файлом, который будет подхвачена inotify скриптом для запуска необходимых обновлений в отдельном процессе
  • переключателя в другую среду исполнения, например, некоторый многопоточный WSGI-сервер
  • как вариант вертикальной качки веса вы могли бы использовать celery если легко развернуть в среде