Estoy trabajando en un proveedor backend/API web que toma datos en tiempo real de una API web de terceros, los coloca en una base de datos MySQL y los pone a disposición en una API HTTP/JSON.Eventlet/async general Granularidad de la tarea de E/S
Proporciono la API con matraz y trabajo con la base de datos con SQLAlchemy Core.
Para la parte de captura de datos en tiempo real, tengo funciones que envuelven la API de terceros enviando una solicitud, analizando el xml devuelto en un dict de Python y devolviéndolo. Llamaremos a estos envoltorios API.
Llamo a estas funciones dentro de otros métodos que toman los datos respectivos, realizan cualquier procesamiento si es necesario (como conversiones de zona horaria, etc.) y lo colocan en la base de datos. Llamaremos a estos procesadores.
He estado leyendo sobre E/S asincrónica y eventlet específicamente y estoy muy impresionado.
voy a incorporarlo en mis datos acaparamiento de código, pero tengo algunas preguntas primero:
es seguro para mí parche mono todo? teniendo en cuenta que tengo matraz, SQLAlchemy y un montón de otras librerías, ¿hay alguna desventaja en el parche de monos (suponiendo que no haya un enlace tardío)?
¿Cuál es la granularidad en la que debería dividir mis tareas? Estaba pensando en crear un grupo que genere periódicamente procesadores. Luego, una vez que el procesador llega a la parte donde llama a los contenedores de API, los contenedores de API iniciarán un GreenPile para obtener los datos HTTP reales utilizando eventlet.green.urllib2. ¿Es este un buen enfoque?
- Tiempos de espera - Quiero asegurarme de que no cuelgue nunca el hilo verde. ¿Es un buen enfoque para establecer el evento. Tiempo de espera a 10-15 segundos por cada hilo verde?
FYI, tengo aproximadamente 10 conjuntos diferentes de datos en tiempo real, y se genera un procesador cada ~ 5-10 segundos.
Gracias!
gracias por su comentario. Acepto no mezclar Flask y Async I/O; no debe haber quedado claro a partir de mi pregunta, pero API (Flask) se ejecuta en un proceso de E/S no asincrónico no parcheado. El capturador de datos se ejecuta en un proceso parcheado, escribiendo en el DB utilizando SQLAlchemy Core (no ORM) solo para fines de simplificación. – user1094786
OK, en ese caso ya lo estás haciendo de esta manera. Sin embargo, me pregunto si realmente necesitas una sincronización para el capturador de datos. Puede ser mejor con otros métodos de concurrencia (multiprocesamiento, apio, etc.), especialmente si su capturador de datos consume mucha CPU. –
+1 para apio. La tarea parece ser un buen candidato para ella. – Tisho