【发布时间】:2023-01-31 00:30:00
【问题描述】:
我有一个 greenlet,它执行一些 I/O 并计算出睡眠多长时间,直到它应该被唤醒以继续。假设一些外部事件应该导致睡眠中的小绿叶立即醒来并在睡眠后继续。我怎样才能做到这一点?
一个解决方案是杀死 greenlet 并创建一个新的,但这看起来很乱。我尝试过的另一个解决方案是 gevent.wait,超时值为 0、0.1 等。这根本没有做任何事情,而且看起来也很乱。
import gevent
import gevent.monkey
gevent.monkey.patch_all()
import time
class G(gevent.Greenlet):
def _run(self):
t = self._determine_how_long_to_sleep()
print(f'in run, will sleep for {t}s')
start = time.time()
# how do I make this cancel-able?
gevent.sleep(t)
end = time.time()
# should get here within 1s of canceling the sleep
assert end - start < t + 1
print('success')
def _determine_how_long_to_sleep(self):
"it's not important how we get this number or why"
return 5
g = G()
g.start()
gevent.sleep(1)
# Sure, this works, but not ideal.
g.kill()
g = G()
g.start()
# Does nothing whatsoever:
#gevent.wait(objects=[g], timeout=0.2)
g.join()
【问题讨论】: