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

时间:2018-08-09 14:49:28

标签: python gevent 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()

1 个答案:

答案 0 :(得分:0)

您的代码无法正常运行的主要原因是因为变量maingreenlet是在main函数内部定义的,并且超出了试图访问它的signal_handler函数的范围。您的代码应引发如下错误:

NameError: global name 'maingreenlet' is not defined

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

当然是在解决代码中的其他问题之后,例如使用//而不是#来开始注释,或使用错误的参数调用函数gevent.kill。 (您没有指定您的gevent版本,但我认为当前版本是1.3.7)实际上,在您调用gevent.killall之后,此函数调用是多余的。

学习使用Python调试器类似程序pdbrpdb2来帮助您调试代码。从长远来看,它将节省您的宝贵时间。