gevent执行状态判断
import gevent
def win():
return 'You win!'
def fail():
raise Exception('You fail at failing.')
# winner = gevent.spawn(win)
loser = gevent.spawn(fail)
print(winner.started) # True
print(loser.started) # True
# 在 Greenlet 中引发的异常,留在 Greenlet 内。
try:
gevent.joinall([winner, loser])
except Exception as e:
print('This will never be reached')
print(winner.value) # 'You win!'
print(loser.value) # None
print(winner.ready()) # True
print(loser.ready()) # True
print(winner.successful()) # True
print(loser.successful()) # False
# 在失败中引发的异常,不会传播到外面
# greenlet. 堆栈跟踪将打印到标准输出,但它
# 不会展开父级的堆栈。
print(loser.exception)
# 虽然有可能在外面再次引发异常
# raise loser.exception
# or with
# loser.get()
True
True
You win!
None
True
True
True
False
You fail at failing.
杀死僵尸进程
当主程序收到 SIGQUIT 时未能让步的 Greenlet 可能使程序的执行时间比预期的要长。这会导致所谓的“僵尸进程”,需要从 Python 解释器外部杀死它们。
一个常见的模式是在主程序上监听 SIGQUIT 事件并gevent.shutdown在退出前调用。
import gevent
import signal
def run_forever():
gevent.sleep(1000)
if __name__ == '__main__':
gevent.signal(signal.SIGQUIT, gevent.kill)
thread = gevent.spawn(run_forever)
thread.join()