繁体   English   中英

从multiprocessing.Process内部调用线程时,is_alive()始终返回False。

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM