无法使用 Ctrl C 命令在 Python 脚本中杀死 Greenlets



当我按下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()

代码不起作用的主要原因是因为变量maingreenlet是在main函数内部定义的,并且超出了尝试访问它的signal_handler函数的范围。您的代码应引发如下错误:

NameError: global name 'maingreenlet' is not defined

如果要将行maingreenlet = []移动到全局范围内,即两个def块之外的任何位置,则greenlets应该毫无问题地被杀死。

当然,这是在你修复了代码中的其他问题之后,比如使用//而不是#来启动注释,或者使用错误的参数调用函数gevent.kill。(您没有指定gevent版本,但我假设当前版本为 1.3.7(实际上,在您调用gevent.killall之后,此函数调用是多余的。

学习使用 Python 调试器 liker pdb 或 rpdb2 来帮助你调试代码。从长远来看,这将节省您宝贵的时间。

相关内容

  • 没有找到相关文章

最新更新