我正在尝试在进程内使用线程,我还想检查线程是否仍在进程内运行。我面临的问题是,当我在线程上调用的进程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
的默认机制(,也只有fork
ed 的线程在新进程中继续存在,没有其他线程在fork
中幸存下来(这就是为什么混合线程和fork
是危险的;如果这些其他线程之一在fork
时持有锁, 该锁仍然由子线程中不存在的线程持有(。
如果您希望线程在子进程中运行,请在那里创建它(在作为target
传递给Process
的函数中(,而不是在父进程中。
你应该传递线程类,而不是实例,并且run_worker
创建实例。
class ProcessClass:
def run_worker(self, worker):
self.worker = worker()
...
worker = WorkerThread
这样,线程是在子进程中创建的,而不是在父进程中创建的,并将引用传递给子进程。