我以前使用的是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的批评。这与“杀人”不同。请看一下我发布的代码。
我不想杀人。我想检查它是否仍然存在,并以最适当的方式优雅地退出线程。如何处理期货?
答案 0 :(得分:0)
如果要让线程完成其当前工作,请使用:
class Player():
def __init__(self):
self.x = 500
self.y = 300
def move(self):
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT and self.x < 720:
self.x += 2.5
if event.key == pygame.K_LEFT and self.x > 280:
self.x -= 2.5
if event.key == pygame.K_UP and self.y > 80:
self.y -= 2.5
if event.key == pygame.K_DOWN and self.y < 520:
self.y += 2.5
如果您想抨击当前的期货价格,并停止所有...期货...(嘿)期货使用:
thread_executor.shutdown(wait=True)
这使用您的terminate_thread函数在线程池执行程序的线程中调用异常。那些被破坏的期货将以例外设置返回。
答案 1 :(得分:-1)
关于线程结果的.cancel()
怎么样?
cancel()尝试取消呼叫。如果当前正在通话 执行且无法取消,则该方法将返回False, 否则,调用将被取消,并且该方法将返回True。