Как выполнить асинхронную постобработку в CherryPy? - PullRequest
4 голосов
/ 21 августа 2009

Контекст: Представьте, что у вас есть стандартное приложение CherryPy hello word:

   def index(self):
      return "Hello world!"
   index.exposed = True

и вы хотели бы выполнить некоторую постобработку, то есть записать обработку запроса или просто зарегистрировать тот факт, что нам звонили с определенного IP. Что бы вы сделали, вероятно:

def index(self):
   self.RunMyPostProcessing()
   return "Hello world!"
index.exposed = True

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

Вопрос: Есть ли способ создания очереди (буфера), поддерживающей глобальную многопоточность, в которую каждый запрос может записывать сообщения (события), которые должны быть зарегистрированы, в то время как какая-то магическая функция будет захватывать его и обрабатывать? Знаете ли вы образец для такой вещи?

Могу поспорить, что CherryPy поддерживает что-то подобное: -)

Заранее спасибо ...

Ответы [ 3 ]

7 голосов
/ 21 августа 2009

«Очередь с поддержкой глобальных потоков» называется Queue.Queue. Я только что добавил рецепт для этого на http://tools.cherrypy.org/wiki/BackgroundTaskQueue

2 голосов
/ 25 ноября 2012

Поскольку я искал это, и теперь оно устарело, я нашел полезным предоставить правильный (2012-й) ответ. Просто добавьте это в начале функции, которая обрабатывает ваш URL:

cherrypy.request.hooks.attach('on_end_request', mycallbackfunction)

В документации больше информации о крючках, но она мне не очень понятна.

2 голосов
/ 21 августа 2009

Пользовательский инструмент on_end_request может быть тем, что вы хотите.

...