2013-05-05 8 views
4

Я запускаю python's apscheduler и периодически хочу сделать некоторую работу POST-ing для некоторых http-ресурсов, которые будут включать использование tornado в качестве запланированного задания. Каждая работа будет выполнять несколько POST. Когда каждый запрос HTTP отвечает, обратный вызов затем вызывается (я думаю, что Tornado использует future, чтобы выполнить это).Как использовать торнадо с APScheduler?

Я занимаюсь поточной безопасностью здесь, так как Apscheduler выполняет задания в различных потоках. Я не смог найти хорошо объясненный пример того, как торнадо лучше всего использовать в нескольких потоках в этом контексте.

Как я могу наилучшим образом использовать apscheduler с tornado таким образом?

Конкретные проблемы:

  1. Какой торнадо ioloop использовать? Документы говорят, что AsyncHTTPClient «работает как волшебство». Ну, волшебство пугает меня. Нужно ли использовать AsyncHTTPClient из текущего потока или я могу использовать главный (его можно указать)?

  2. Существуют ли проблемы с защитой от потоков с моим обратным вызовом, в отношении которого я использую ioloop?

  3. Непонятно, что происходит, когда поток завершается, но есть еще ожидающий обратный вызов/будущее, которое необходимо вызвать. Здесь есть проблемы?

  4. Поскольку apscheduler запускается как потоки в процессе, а python имеет GIL, то это почти то же самое, что и один IOLoop из основного потока - в отличие от нескольких циклов из разных потоков (относительно производительности)?

+0

Привет, я помог вам в любом случае? Не могли бы вы прокомментировать, если вам нужна дополнительная информация об этом? – vaidik

ответ

1
  1. Все утилиты Торнадо работают около IOLoop смерча - это включает в себя AsyncHTTPClient, а также. И IOLoop не считается потокобезопасным. Поэтому не стоит запускать AsyncHTTPClient из любого потока, кроме потока, на котором выполняется ваш основной IOLoop. Подробнее о том, как использовать IOLoop, read this.

  2. Если вы используете tornado.ioloop.IOLoop.instance(), то я полагаю, что если вы намерены не добавлять обратные вызовы в IOLoop основной нити. Вы можете использовать tornado.ioloop.IOLoop.current(), чтобы правильно ссылаться на правильный экземпляр IOLoop для правильной нити. И вам придется делать слишком много бухгалтерского учета, чтобы добавить обратный вызов к IOLoop не основного потока из другого IOLoop не основного потока - он просто станет слишком грязным.

  3. Я не совсем понимаю это. Но, как я понимаю, есть два сценария. Либо вы говорите о потоке с IOLoop, либо без IOLoop. Если в потоке нет запуска IOLoop, то после того, как поток достигнет завершения, любой обратный вызов должен быть выполнен IOLoop в некотором другом потоке (возможно, в основном потоке). Другой сценарий заключается в том, что поток, о котором вы говорите, имеет запуск IOLoop. Затем поток не будет завершен, если вы не остановите IOLoop. И поэтому выполнение обратного вызова будет действительно зависеть от того, когда вы остановите IOLoop.

  4. Честно говоря, я не вижу большого смысла использовать темы с Tornado. Не будет никакого выигрыша в производительности, если вы не будете работать на PyPy, и я не уверен, что Tornado будет хорошо играть (не все вещи, как известно, работают над этим, и, честно говоря, я не знаю и о Tornado).Вы можете также иметь несколько процессов вашего приложения Tornado, если это веб-сервер, и использовать Nginx в качестве прокси-сервера и LB. Поскольку вы привезли apscheduler, я бы предложил использовать IOLoop's add_timeout, который делает практически то же самое, что вам нужно, и он является родным для Tornado, который играет с ним гораздо приятнее. Обратные вызовы в любом случае очень сложны для отладки. Объедините его с потоками Python, и у вас может быть огромный беспорядок. Если вы готовы рассмотреть другой вариант, просто переместите всю асинхронную обработку из этого процесса - это значительно облегчит жизнь. Подумайте о чем-то вроде Сельдерея для этого.

+1

Спасибо за подробную информацию. С тех пор я перешел к использованию greenlets через gevent - и использовал очень недавнюю сборку APScheduler, которая теперь обеспечивает совместимость с gevent. Также распространяются нагрузки на несколько процессов торнадо. – Rocketman

+0

Распространение нагрузки на несколько процессов намного проще, чем использование потоков с Tornado. Даже руководство мудрым своим разумным выбором. Если мой ответ отвечает на ваши старые требования/вопрос, можете ли вы, пожалуйста, пойти дальше и принять его в качестве ответа, если вы не возражаете. – vaidik

Смежные вопросы