我以前使用的是threading.Thread模块。现在我使用concurrent.futures->;ThreadPoolExecutor。以前,我使用以下代码退出/终止/完成线程:def terminate_thread(thread):
"""Terminates a python thread from another thread.
:param thread: a threading.Thread instance
"""
if not thread.isAlive():
return
exc = ctypes.py_object(SystemExit)
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(
ctypes.c_long(thread.ident), exc)
if res == 0:
raise ValueError("nonexistent thread id")
elif res > 1:
# """if it returns a number greater than one, you're in trouble,
# and you should call it again with exc=NULL to revert the effect"""
ctypes.pythonapi.PyThreadState_SetAsyncExc(thread.ident, None)
raise SystemError("PyThreadState_SetAsyncExc failed")
这似乎不适用于futures接口。这里的最佳实践是什么?只是return?我的线程正在控制Selenium实例。我需要确保当我杀死一个线程时,Selenium实例被销毁。在
编辑:我已经看到了一篇被引用为重复的帖子。这是不够的,因为当你冒险进入类似未来的东西时,行为可能会完全不同。在前一个线程模块的情况下,我的terminate_thread函数是可以接受的,不适用于对其他q/a的批评,它与“killing”是不一样的。请看一下我发布的代码。在
我不想杀人。我想检查它是否仍然存在,并以最适当的方式优雅地退出线程。期货怎么办?在