Использование web.py как не блокирующего http-сервера
изучая некоторое базовое программирование с помощью python, я нашел web.py. я
застрял с глупой проблемой:
Я написал простое консольное приложение с основным контуром, который обрабатывает элементы
из очереди в отдельных потоках. моя цель - использовать web.py для добавления
элементы в мою очередь и статус отчета очереди через веб-запрос. я
получил это работает как модуль, но не может интегрировать его в основное приложение.
моя проблема в том, что когда я запускаю http-сервер с app.run(), он блокирует мой
основной цикл.
также попытался запустить его с thread.start_new_thread, но он все еще
блоки.
есть простой способ запустить интегрированный http-сервер web.py в
в моем приложении.
в вероятном случае, что я жертва фундаментального
недоразумения, любая попытка разъяснить мою ошибку в рассуждении
помогите;.) (пожалуйста, медведь со мной, я новичок:-)
Ответы
Ответ 1
Я нашел рабочее решение. В отдельном модуле я создаю свой веб-сервер:
import web
import threading
class MyWebserver(threading.Thread):
def run (self):
urls = ('/', 'MyWebserver')
app = web.application(urls, globals())
app.run()
def POST ...
В основной программе я просто вызываю
MyWebserver().start()
и чем продолжать то, что я хочу, имея веб-сервер, работающий в фоновом режиме.
Ответ 2
Не было бы проще переписать код основного цикла как функцию, которую вы вызываете снова и снова, а затем вызывать это из функции, которую вы передаете в runsimple
...
Это гарантировало не полностью удовлетворить ваши требования, но если вы в спешке, это может быть проще всего.
Ответ 3
или просто использовать Tornado, неблокирующий веб-сервер для Python с API, похожим на webpy -
http://www.tornadoweb.org/
Ответ 4
Я также недавно использовал Beanstalkd для очереди задач, которые будут выполняться в отдельном потоке. Ваш обработчик web.py просто переносит задание в трубу, и его выполняет полностью отдельный script. У вас может быть любое их количество, и вы получаете преимущества расширенного управления очередью и т.д.