1 回答

TA貢獻1802條經驗 獲得超5個贊
創建新的子進程時,它會獲得父進程地址空間的副本,但是任何后續更改(無論是父進程還是子進程)都不會反映在其他進程的內存中。他們每個人都有自己的私人地址空間。
您可以創建一個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)
這種方法有一些開銷,因為它會產生一個子進程來托管服務器Manager。
如果您可以調整工作進程邏輯以改為使用隊列,這里有一個示例:
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()
添加回答
舉報