如何从父级杀死线程池?

问题描述 投票:0回答:1

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

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")

我使用了池,因为该函数返回我需要映射的值。我正在寻找的一种方法是,在进行某些父调用时,通过删除作业关闭池,同时保持主类线程(运行功能[main loop]运行)。任何帮助都将受到赞赏。

python threadpool python-multithreading pool
1个回答
0
投票

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

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)

希望这对某人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.