веб-нить Python - PullRequest
       30

веб-нить Python

0 голосов
/ 27 января 2012

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

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

Теперь я использую:

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

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

Есть идеи?

Ответы [ 2 ]

1 голос
/ 27 января 2012

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

CGI должна ждать завершения процесса в целом. Темы не помогают.

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

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

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

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

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