1 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
創(chuàng)建新的子進(jìn)程時(shí),它會獲得父進(jìn)程地址空間的副本,但是任何后續(xù)更改(無論是父進(jìn)程還是子進(jìn)程)都不會反映在其他進(jìn)程的內(nèi)存中。他們每個(gè)人都有自己的私人地址空間。
您可以創(chuàng)建一個(gè)Manager()并改用其共享列表對象:
import time
??
from multiprocessing import Manager, Process
def separateProcess(start, counter):
? ? while True:
? ? ? ? time.sleep(1)
? ? ? ? print("length of the list from separate Process: "+str(len(procs)))
if __name__ == '__main__':
? ? m = Manager()
? ? procs = m.list()
? ? print("program started")
? ? counter = 0
? ? Process(target=separateProcess, args=(counter, counter)).start()
? ? print("program end")
? ? while True:
? ? ? ? counter += 1
? ? ? ? newstring = "string "+str(counter)
? ? ? ? procs.append(newstring)
? ? ? ? print("length of the list from main: " + str(len(procs)))
? ? ? ? time.sleep(2)
這種方法有一些開銷,因?yàn)樗鼤a(chǎn)生一個(gè)子進(jìn)程來托管服務(wù)器Manager。
如果您可以調(diào)整工作進(jìn)程邏輯以改為使用隊(duì)列,這里有一個(gè)示例:
import random
import time
from multiprocessing import cpu_count, Process, Queue
def worker(q):
? ? for item in iter(q.get, 'STOP'):
? ? ? ? t = random.uniform(1, 5)
? ? ? ? print(f'START item: {item}')
? ? ? ? time.sleep(t)
? ? ? ? print(f'END item: {item}, ({t:.3f}s)')
def main():
? ? cpus = cpu_count()
? ? q = Queue()
? ? for i in range(5):
? ? ? ? q.put(i)
? ? for i in range(cpus):
? ? ? ? Process(target=worker, args=(q,)).start()
? ? for i in range(cpus):
? ? ? ? q.put('STOP')
if __name__ == '__main__':
? ? main()
添加回答
舉報(bào)