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

时间:2018-10-03 16:03:14

标签: python python-3.x concurrency concurrent.futures

我以前使用的是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 个答案:

答案 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。

https://docs.python.org/3/library/concurrent.futures.html