当我按下Ctrl+C
时,调用会像预期的那样跳转到signal_handler
,但是greenlets
在继续这个过程时不会被终止。
# signal handler to process after catch ctrl+c command
def signal_handler(signum, frame):
print("Inside Signal Handler")
gevent.sleep(10)
print("Signal Handler After sleep")
gevent.joinall(maingreenlet)
gevent.killall(maingreenlet,block=True,timeout=10)
gevent.kill(block=True)
sys.exit(0)
def main():
signal.signal(signal.SIGINT, signal_handler) // Catching Ctrl+C
try:
maingreenlet = [] // Creating a list of greenlets
while True:
for key,profileval in profile.items():
maingreenlet.append(gevent.spawn(key,profileval)) # appending all grrenlets to list
gevent.sleep(0)
except (Error) as e:
log.exception(e)
raise
if __name__ == "__main__":
main()
发布于 2018-10-12 09:48:17
代码不能正常工作的主要原因是因为变量maingreenlet
是在main
函数中定义的,并且超出了试图访问它的signal_handler
函数的范围。您的代码应该抛出如下错误:
NameError: global name 'maingreenlet' is not defined
如果您要将行maingreenlet = []
移动到全局作用域中,即两个def
块之外的任何位置,greenlets
应该会被杀死而不会出现问题。
当然,这是在修复代码中的其他问题之后进行的,比如使用//
而不是#
来启动注释,或者使用错误的参数调用函数gevent.kill
。(您没有指定您的gevent
版本,但我假设当前版本为1.3.7)实际上,在您调用gevent.killall
之后,此函数调用是多余的。
学习如何使用Python调试器、pdb或rpdb2来帮助您调试代码。从长远来看,这将为你节省宝贵的时间。
https://stackoverflow.com/questions/51770091
复制相似问题