2011-07-12 15 views
5

El siguiente script tiene el propósito de ejecutar muchas funciones simultáneamente, pero no tengo idea de por qué no está funcionando correctamente.
Las funciones se ejecutan de forma secuencial, no paralela.Problema al utilizar greenlet para ejecutar múltiples funciones simultáneamente

Agradecería cualquier sugerencia para aclararme, sobre lo que estoy haciendo mal.

import time 
import eventlet 


EXECUTION_TIMEOUT = 10 

def example(name, steps_limit): 
    print 'Starting process %s with %d steps' % (name, steps_limit) 
    for i in range(1, steps_limit+1): 
     print "Process %s, step %d" % (name, i) 
     time.sleep(2) 
    print 'Finishing process %s with %d steps' % (name, steps_limit) 


def fetch(input_data): 
    example(input_data['name'], input_data['steps']) 

test_data = [{'name':'proceso1', 'steps':3}, 
      {'name':'proceso2', 'steps':5}, 
      {'name':'proceso3', 'steps':6}, 
      ] 

def main(): 
    #Setting up time out 
    timeout = eventlet.timeout.Timeout(EXECUTION_TIMEOUT) 
    #initialize pool 
    pool = eventlet.GreenPool(size=1000) 
    try: 
     for hits in pool.imap(fetch, test_data): 
      pass 
    except eventlet.Timeout: 
     print 'Operation interrupted by timeout concept' 
    finally: 
     timeout.cancel() 


if __name__ == '__main__': 
    main() 
+0

Por favor incluya cualquier mensaje de error que esté recibiendo, y sea más específico en cuanto a lo que está sucediendo. ¿regresa inmediatamente? ¿Se cuelga para siempre? ¿Qué has intentado arreglar? – TorelTwiddler

+0

No hay mensajes de error, no cuelga para siempre. El problema es que el proceso ocurre de forma sequantial, no desordenada. Cada función comienza cuando termina el anterior. No deseo eso. – rmaceissoft

+1

Ya veo cuál es mi error. Estoy usando "time.sleep" en lugar de "eventlet.sleep". La diferencia es que el último no bloquea a todo el intérprete y, por lo tanto, permite que los otros compartimentos realicen también sus solicitudes. Gracias a mí mismo por este tiempo; -) .... y espero que esta pregunta ficticia ayude a los demás ... – rmaceissoft

Respuesta

2

Tienes razón en time.sleep() es el culpable.

Pero no es necesario reemplazar time.sleep() con eventlet.sleep(). En cambio, puede parche mono time.sleep para convertirse en eventlet.sleep.

Esto es, de hecho, preferido, porque de esa manera las bibliotecas que no conoces usan time.sleep también se arreglan, mientras que si lo arreglas tú mismo, solo arreglaste tu código. Por este motivo, en gevent, recomendamos llamar al gevent.monkey.patch_all() para todos los programas. En eventlet, existe una función similar existe.

+0

gracias por su valiosa aclaración. Con evenlet, obtienes el mismo efecto usando. eventlet.monkey_patch() Incluso, puede especificar qué módulo desea parche de mono. Por ejemplo, para el único módulo de tiempo de parche mono, eventlet.monkey_patch (time = True) – rmaceissoft

Cuestiones relacionadas