首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法使用Ctrl C命令在Python脚本中终止Greenlet

无法使用Ctrl C命令在Python脚本中终止Greenlet
EN

Stack Overflow用户
提问于 2018-08-09 22:49:28
回答 1查看 402关注 0票数 0

当我按下Ctrl+C时,调用会像预期的那样跳转到signal_handler,但是greenlets在继续这个过程时不会被终止。

代码语言:javascript
运行
复制
# 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()
EN

回答 1

Stack Overflow用户

发布于 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调试器、pdbrpdb2来帮助您调试代码。从长远来看,这将为你节省宝贵的时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51770091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档