相当于Python 3中的thread.interrupt_main()



在Python 2中有一个函数thread.interrupt_main(),当从子线程调用时,它会在主线程中引发KeyboardInterrupt异常。

这也可以通过Python3中的_thread.interrupt_main()获得,但它是一个低级的"支持模块",主要用于其他标准模块。

在Python3中,如果有threading模块的话,那么现代的方法是什么?

手动引发异常有点低级,所以如果您认为必须这样做,请使用_thread.interrupt_main(),因为这是您所要求的等效值(threading模块本身不提供此功能(。

不过,可能有一种更优雅的方式来实现你的最终目标。也许设置和检查一个标志就足够了,或者使用threading.Event(如@RFmyD已经建议的(,或者使用通过queue.Queue传递的消息。这取决于您的具体设置。

如果您需要一种方法让线程停止执行整个程序,这就是我使用threading.Event:的方法

def start():
"""
This runs in the main thread and starts a sub thread
"""

stop_event = threading.Event()
check_stop_thread = threading.Thread(
target=check_stop_signal, args=(stop_event), daemon=True
)
check_stop_thread.start()
# If check_stop_thread sets the check_stop_signal, sys.exit() is executed here in the main thread.
# Since the sub thread is a daemon, it will be terminated as well.
stop_event.wait()
logging.debug("Threading stop event set, calling sys.exit()...")
sys.exit()


def check_stop_signal(stop_event):
"""
Checks continuously (every 0.1 s) if a "stop" flag has been set in the database.
Needs to run in its own thread.
"""
while True:
if io.check_stop():
logger.info("Program was aborted by user.")
logging.debug("Setting threading stop event...")
stop_event.set()
break
sleep(0.1)

您可能需要研究线程。事件模块。

相关内容

  • 没有找到相关文章

最新更新