is_alive() 从多处理内部调用线程时始终返回 False.过程



我正在尝试在进程内使用线程,我还想检查线程是否仍在进程内运行。我面临的问题是,当我在线程上调用的进程is_alive()运行相同的代码时,总是返回False

from threading import Thread
from multiprocessing import Process
import time
class WorkerThread(Thread):
def run(self):
i = 0 
while i < 10:
print ("worker running..")
time.sleep(1)
i += 1
class ProcessClass:
def run_worker(self, worker):
self.worker = worker
self.worker.daemon = True
self.worker.start()
i = 0
while i < 12:
print (F"Is worker thread alive? {self.worker.is_alive()}")
time.sleep(1)
i += 1
worker = WorkerThread()
processclass = ProcessClass()
# Calling directly works as expected
processclass.run_worker(worker)

当我直接调用该方法时is_alive()按预期工作,但是在进程内调用该方法时,它总是返回False

# Calling inside a process always returns False
parentProcess = Process(target = processclass.run_worker, args = (worker,))
parentProcess.start()

Process是单独的进程;线程是单个进程的本地线程。即使你fork(类 UNIX 系统上Process的默认机制(,也只有forked 的线程在新进程中继续存在,没有其他线程在fork中幸存下来(这就是为什么混合线程和fork是危险的;如果这些其他线程之一在fork时持有锁, 该锁仍然由子线程中不存在的线程持有(。

如果您希望线程在子进程中运行,请在那里创建它(在作为target传递给Process的函数中(,而不是在父进程中。

你应该传递线程类,而不是实例,并且run_worker创建实例。

class ProcessClass:
def run_worker(self, worker):
self.worker = worker()
...
worker = WorkerThread

这样,线程是在子进程中创建的,而不是在父进程中创建的,并将引用传递给子进程。

相关内容

  • 没有找到相关文章

最新更新