我是 Python 3multiprocessing模塊的新手,可能似乎誤解了它的一個概念。在我的應用程式中,我有一個主執行緒,像往常一樣,還有另一個執行緒用于一些“后臺”作業,稱為“BgThread”。從第二個執行緒中,我生成了 aProcess并通過start().
新的子流程現在可以正確啟動并完成其作業。但是,當我在(VS Code)除錯器中查看我的應用程式時,我可以看到這個子行程也運行了第二個執行緒,再次稱為“BgThread”。
在 Linux 上運行時,我嘗試通過 生成執行緒mp.set_start_method("spawn"),如多處理檔案中所述,但結果相同。此外,當我run()在我的第二個執行緒類的方法中設定斷點時,在子行程中它不會停止(但它在主行程中正確地這樣做)。
這是正常行為嗎?如果是這樣,那么我不明白它-為什么子行程也從其父行程繼承了第二個執行緒,即使它似乎并沒有真正重新啟動它,如上所述?是否需要阻止我的子行程再次啟動第二個執行緒?
uj5u.com熱心網友回復:
正如@AndriiMaletskyi 評論的那樣,您所看到的一定是除錯器引入的一些奇怪的結果。下面的程式運行在Linux下spawn用于啟動新行程,首先創建一個執行緒,然后啟動一個行程。該執行緒被傳遞一個multiprocessing.Value實體,該實體在回圈中遞增 5 次,在該回圈中它還列印出一條訊息。如果子行程繼承了這個執行緒,我們希望看到列印出的訊息超過 5 條,并且這個multiprocessing.Value實體的最終值大于 5。另外,作為一個很好的衡量標準,子行程列舉它的執行緒并且只有一個。如果它繼承了主行程的執行緒,那么至少有兩個,如果不是三個。
from multiprocessing import Process, Value, set_start_method
from os import getpid
import threading
import time
def worker(*args):
first_time = True
for x, y in args:
time.sleep(1.1)
print(f'{x} {y} = {x y}')
if first_time:
first_time = False
for thread in threading.enumerate():
print('thread:', thread.name)
def my_thread(v):
for counter in range(1, 6):
print(f'time: {time.time()}, counter: {counter}, process id: {getpid()}, thread id: {threading.get_ident()}')
with v.get_lock():
v.value = 1
time.sleep(1)
if __name__ == '__main__':
set_start_method("spawn")
v = Value('i', 0, lock=True)
t = threading.Thread(target=my_thread, args=(v,))
t.start()
args = ((1, 2), (3, 4), (4, 5), (6,7))
p = Process(target=worker, args=args)
p.start()
p.join()
t.join()
print('Value =', v.value)
印刷:
time: 1637499015.9222672, counter: 1, process id: 33, thread id: 139689716135680
time: 1637499016.9244416, counter: 2, process id: 33, thread id: 139689716135680
1 2 = 3
thread: MainThread
time: 1637499017.925643, counter: 3, process id: 33, thread id: 139689716135680
3 4 = 7
time: 1637499018.926832, counter: 4, process id: 33, thread id: 139689716135680
4 5 = 9
time: 1637499019.9280066, counter: 5, process id: 33, thread id: 139689716135680
6 7 = 13
Value = 5
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/362903.html
