簡體   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