[英]python multiprocessing after kill process give is_alive() status True
[英]is_alive() always returns False when called on a Thread from inside multiprocessing.Process
我正在尝试在进程内使用线程,我还想检查线程是否仍在进程内运行。 我面临的问题是,当我在线程上调用的进程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()
您应该传递线程类而不是实例,并让run_worker
创建该实例。
class ProcessClass:
def run_worker(self, worker):
self.worker = worker()
...
worker = WorkerThread
这样,线程将在子进程中创建,而不是在父进程中通过传递给子进程的引用创建。
Process
是独立的流程 ; 线程是单个进程本地的。 甚至当你fork
(后面的默认机制Process
的类UNIX系统),只有线程fork
版继续在新的进程存在,没有其它线程生存的fork
(这就是为什么混合线程和fork
是危险的;如果一个这些其他线程中的一个在fork
时持有一个锁,该锁仍由子代中不存在的线程持有。
如果希望线程在子进程中运行,请在子进程中创建它(在作为target
传递给Process
的函数内),而不是在父进程中创建。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.