【问题标题】:How to kill a Threading pool from parent?如何从父级杀死线程池?
【发布时间】:2019-07-18 05:29:22
【问题描述】:

我有具有以下运行功能的线程分类。 因此,当此类设置为运行时,它会继续检查多处理管理器队列,如果其中有任何内容,它会启动池以运行作业(跟踪功能)。作业完成后,池会自动关闭,如果不为空,则开始检查整个队列。

def runQueue(self):
    print("The current thread is", threading.currentThread().getName())
    while True:
        time.sleep(1)
        self.pstate=False
        if self.runStop: #this stops the whole threading by dropping main loop
            break
        while not self.tasks.empty():
            self.pstate=True
            task = self.tasks.get()
            with ThreadPool(processes=1) as p: #<- want to kill this pool
                ans = p.apply(self.track, args=(task,))
                self.queueSend(ans)
                self.tasks.task_done()
    print("finished job")

我使用了池,因为该函数返回一个我需要映射的值。我正在寻找一种方法,即在某些父调用时,池通过丢弃作业而关闭,同时保持主类线程(运行函数 [主循环] 运行)。 任何形式的帮助表示赞赏。

【问题讨论】:

  • 我正在阅读有关引发异常的内容,但不知道它是如何工作的。
  • 你看过this的问题吗?它可能会给你一个答案
  • 我正在看文章,但我没有完全理解。你能帮帮我吗?我需要首先更改我的代码以使用多处理处理而不是池,然后我不理解异常部分。 @rotemtal
  • 基本上,您需要将处理(通过进程或线程)封装在 try-except 块中,在出现异常时(在父进程中,在 try-except 块中)您只需调用 @987654323 @ 在线程池或每个进程上。如果这确实满足了您修改代码的要求,请告诉我

标签: python threadpool python-multithreading pool


【解决方案1】:

我发现对于我的情况 pool.terminate 仅适用于 I/O 应用程序,我确实在网上找到了一些与池无关但我可以实施的解决方案。 一种解决方案是将线程作为多处理进程运行,然后调用 process.terminate() 或使用多处理池,然后调用 pool.terminate。
请注意,对于 CPU 密集型任务,多处理速度更快。如果任务是 I/O 密集型线程是最好的解决方案。
我找到杀死线程的唯一方法是使用 win32 ctypes 模块。 如果你开始一个线程并得到它的 tid 与

tid thread.ident

然后你可以把你的 kill_thread(tid) 函数放在下面

w32 = ctypes.windll.kernel32
THREAD_TERMINATE = 1 
def kill_thread(tid):
        handle = w32.OpenThread(THREAD_TERMINATE, False,tid)
        result = w32.TerminateThread(handle, 0)
        w32.CloseHandle(handle)

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2011-02-13
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2011-06-29
    • 1970-01-01
    • 2017-01-10
    相关资源
    最近更新 更多