![](/img/trans.png)
[英]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.