Eventlet/детализация общей задачи асинхронного ввода/вывода

Я работаю над поставщиком веб-интерфейса/API, который получает данные в реальном времени от стороннего веб-API, помещает их в базу данных MySQL и делает их доступными через HTTP/JSON API.

Я предоставляю API с помощью flask и работаю с БД с помощью SQLAlchemy Core.

Для части захвата данных в реальном времени у меня есть функции, которые оборачивают сторонний API, отправляя запрос, анализируя возвращенный xml в словарь Python и возвращая его. Мы будем называть эти оболочки API.

Затем я вызываю эти функции в других методах, которые берут соответствующие данные, при необходимости выполняют любую обработку (например, преобразование часовых поясов и т. д.) и помещают их в БД. Мы назовем эти процессоры.

Я читал об асинхронном вводе-выводе и событиях в частности, и я очень впечатлен.

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

  1. Безопасно ли для меня все исправлять обезьяны? учитывая, что у меня есть flask, SQLAlchemy и куча других библиотек, есть ли какие-либо недостатки в исправлении обезьян (при условии отсутствия позднего связывания)?

  2. С какой степенью детализации я должен разделить свои задачи? Я думал о создании пула, который периодически спавнит процессоры. Затем, как только процессор достигает части, где он вызывает оболочки API, оболочки API запускают GreenPile для получения фактических данных HTTP с помощью eventlet.green.urllib2.Хороший ли это подход?

  3. Тайм-ауты. Я хочу убедиться, что гринтреды никогда не зависают. Это хороший подход, чтобы установить eventlet.Timeout на 10-15 секунд для каждого зеленого потока?

К вашему сведению, у меня есть около 10 различных наборов данных в реальном времени, и процессор запускается каждые ~5-10 секунд.

Спасибо!

10
задан user1094786 25 May 2012 в 20:26
поделиться