为了账号安全,请及时绑定邮箱和手机立即绑定

Python - 正确杀死/退出期货线程?

Python - 正确杀死/退出期货线程?

蓝山帝景 2021-06-28 04:06:26
我以前使用过该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")这似乎不适用于期货界面。这里的最佳做法是什么?只是return?我的线程正在控制 Selenium 实例。我需要确保当我杀死一个线程时,Selenium 实例被拆除。编辑:我已经看到被引用为重复的帖子。这是不够的,因为当你冒险进入像期货这样的东西时,行为可能会完全不同。在之前的线程模块的情况下,我的terminate_thread功能是可以接受的,不适用于其他q/a的批评。这与“杀戮”不同。请查看我发布的代码以了解这一点。我不想杀人。我想检查它是否还活着并以最正确的方式优雅地退出线程。期货怎么做?
查看完整描述

2 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

如果您想让线程完成当前的工作,请使用:


thread_executor.shutdown(wait=True)

如果您想打击当前正在运行的期货并停止所有...future...(heh) 期货,请使用:


thread_executor.shutdown(wait=False)

for t in thread_executor._threads:

    terminate_thread(t)

这使用您的 terminate_thread 函数在线程池执行程序中的线程中调用异常。那些被打乱的期货将返回并设置异常。


查看完整回答
反对 回复 2021-07-06
  • 2 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信