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()
添加回答
举报