2015-10-04 5 views
1
import gevent 
from gevent.event import AsyncResult 
import time 

class Job(object): 
    def __init__(self, name): 
     self.name = name 

def setter(job): 
    print 'starting' 
    gevent.sleep(3) 
    job.result.set('%s done' % job.name) 

def waiter(job): 
    print job.result.get() 


# event loop 
running = [] 
for i in range(5): 
    print 'creating' 
    j = Job(i) 
    j.result = AsyncResult() 
    running.append(gevent.spawn(setter, j)) 
    running.append(gevent.spawn(waiter, j)) 

print 'started greenlets, event loop go do something else' 
time.sleep(5) 
gevent.joinall(running) 

GEvent оленья кожа на самом деле не начать до joinall называетсяPython Event петля ж/GEvent

  • Есть ли что-то, что бы начать/икру GEvent асинхронно (почему она не запускается сразу, как только мицелий называется)?
  • Есть ли select/epoll на ходу зеленых, чтобы посмотреть, к какому соединению нужно добавить вместо joinall()?

ответ

1

Нет, это не начинается сразу. Он начнется, как только ваша основная зелень выйдет на концентратор (освободит управление, вызвав, например, сон или соединение).

Очевидно, вы намерены, что оно начинается, когда вы звоните time. Это не так, потому что у вас нет обезьяны.

Добавьте эти строки в самый верх файла:

from gevent import monkey 
monkey.patch_all() 

Это будет иметь поведение, которое вы хотите (потому что под капотом, time будет изменен, чтобы получить к ступице).

Кроме того, вы можете позвонить по телефону gevent.sleep.

0

Поскольку вы не использовали патч обезьяны, функция time.sleep() заставляет приложение останавливаться. Вместо этого используйте gevent.sleep (5).