【发布时间】:2013-12-06 07:22:04
【问题描述】:
我写了一个脚本来玩gevent.event.Event,但是我发现wait方法好像没有生效。我使用的gevent版本是1.0。
我的脚本如下,你也可以得到here:
#!/urs/bin/env python2.7
#coding: utf-8
"""Test the usage of 'gevent.event.Event' class.
"""
import random
import gevent
from gevent.event import Event
class TestEvent(object):
def __init__(self):
self.event = Event()
def run(self):
producers = [gevent.spawn(self._producer, i) for i in xrange(3)]
consumers = [gevent.spawn(self._consumer, i) for i in xrange(3)]
tasks = []
tasks.extend(producers)
tasks.extend(consumers)
gevent.joinall(tasks)
def _producer(self, pid):
print("I'm producer %d and now I don't want consume to do something" % (pid,))
self.event.clear()
sleeptime = random.randint(0, 5) * 0.01
print("Sleeping time is %f" % (sleeptime, ))
gevent.sleep(sleeptime)
print("I'm producer %d and now consumer could do something." % (pid,))
self.event.set()
def _consumer(self, pid):
print("I'm consumer %d and now I'm waiting for producer" % (pid,))
flag = self.event.wait()
print("I'm consumer %d. Flag is %r and now I can do something" % (pid, flag))
self.event.clear()
if __name__ == '__main__':
test = TestEvent()
test.run()
脚本的输出为:
【问题讨论】:
-
您期待什么?你得到的输出有什么问题?
-
@DavidSchwartz,如果 Event()._flag 为 False,则 wait() 方法应阻止当前的greenlet,但它没有显示。
-
你怎么知道它没有?不清楚为什么你会觉得这令人惊讶。您是否有任何证据表明消费者在标志为真时没有被阻止,在它调用等待和等待返回之间?
-
我在 _consumer 中获取标志值,然后打印出来。输出显示当标志为 False 时,_consumer 仍然运行而不是阻塞。
-
你知道两件事:1)标志从真到假。 2)线程醒来。由此,您得出结论,线程在标志为假时唤醒。这个结论没有证据支持。
标签: python-2.7 gevent