在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)
您可能需要研究线程。事件模块。