2010-10-16 10 views
5

Tengo una aplicación Python que, para ser breve, recibe datos de un servidor remoto, los procesa, responde al servidor y ocasionalmente guarda los datos procesados ​​en el disco. El problema que he encontrado es que hay un lote de datos para escribir, y el proceso de guardado puede tardar más de medio minuto. Esto es aparentemente una operación de bloqueo, por lo que el IO de la red está bloqueado durante este tiempo. Me gustaría poder hacer que la operación de guardado se realice en segundo plano, por así decirlo, para que la aplicación pueda continuar comunicándose con el servidor de manera razonablemente rápida.¿Qué módulo de subprocesamiento debo usar para evitar que el disco IO bloquee la red IO?

sé que probablemente necesito algún tipo de módulo de roscar de lograr esto, pero no puedo decir cuáles son las diferencias entre thread, threading, multiprocessing, y las otras opciones. ¿Alguien sabe lo que estoy buscando?

+1

relacionado: http://stackoverflow.com/questions/2629680/deciding-between-subprocess-multiprocessing-and-thread-in-python –

Respuesta

6

Dado que está vinculado a E/S, utilice el módulo threading.

Casi nunca debería necesitar usar thread, es una interfaz de bajo nivel; el módulo threading es un contenedor de interfaz de alto nivel para thread.

El módulo multiprocessing es diferente del módulo de subprocesamiento, multiprocessing utiliza múltiples subprocesos para ejecutar una tarea; multiprocessing simplemente usa la misma interfaz como threading para reducir la curva de aprendizaje. multiprocessing se usa normalmente cuando tiene un cálculo de límite de CPU, y necesita evitar el GIL (Bloqueo global de intérprete) en una CPU multinúcleo.

Una alternativa algo más esotérica al multi-threading es la E/S asíncrona que usa el módulo asyncore. Otra opción incluye Stackless Python y Twisted.

+1

(Disculpe) Haga clic aquí para agregar que esta respuesta no es del todo preciso con respecto a la E/S de disco en particular. La E/S de disco asíncrona es diferente de la no-bloqueo: el bloqueo se refiere a una llamada al sistema que no tiene la respuesta y se garantiza que llevará tiempo; en otras palabras, red y E/S canalizada. Sin embargo, al leer desde el disco, la E/S nunca "bloqueará": podría ser lenta. asyncore y twisted focus en E/S sin bloqueo por lo que no pueden ayudar en esta situación. Los hilos * deberían * ayudar, pero me ha mordido el GIL con E/S de disco ... No dude en corregirme en esto. –

Cuestiones relacionadas