我想使用多进程来处理并行工作,但是不知道如何获取进程的返回值。
我需要保存这些返回值用于后续的处理。
from multiprocessing import Process
def run1(N):
trajlen1 = np.empty(shape=(0, 1))
etaODAVG1 = np.empty(shape=(0, 1))
for i in N:
trajOD, etaODavg = traj_judge(link_start[i], link_start5, link_end[i], link_end5, eta2)
if len(trajOD) == 1:
etaODavg1 = simple_eta1[i]
else:
etaODavg1 = etaODavg
etaODAVG1=np.append(etaODAVG1, [[etaODavg1]], axis=0)
trajlen1=np.append(trajlen1, [[len(trajOD)]], axis=0)
print('write:', i, 'trajlen:',len(trajOD),'etaODAVG',etaODavg1,'simpale_eta:', simple_eta1[i], 'eta1:', eta1[i])
return etaODAVG1,trajlen1
def main():
p1=Process(target=run1,args=(l2[0],))
p1.start()
p1.join()
if __name__ == '__main__':
main()
我需要在main()中获取并保存etaODAVG1,trajlen1这两个返回值。
用进程池吧,还能控制并发量,多香
from concurrent.futures import ProcessPoolExecutor, wait
def run1(num):
return num, num - 1
def main():
pool = ProcessPoolExecutor(max_workers=10)
process = []
for i in range(10):
p = pool.submit(run1, i)
process.append(p)
wait(process)
for p in process:
r1, r2 = p.result()
print(r1, r2)
if __name__ == '__main__':
main()
multiprocessing提供了进程间共享数据的两个工具:multiprocessing.Value和multiprocessing.Array,前者用于单值共享,后者用于数组共享。如有兴趣,可参考拙作《Python高手修炼之道》一书,下面是书中关于进程间共享内存的例子。
# -*- coding: utf-8 -*-
"""
3.9.3 进程间通信——共享内存
"""
import os, time
import multiprocessing as mp
def sub_process_A(flag, data):
"""A进程函数"""
while True:
if flag.value == 0: # 若标志为0
time.sleep(1)
for i in range(len(data)): # 共享数组各元素加2
data[i] += 2
flag.value = 1 # 置标志为1
print([item for item in data])
def sub_process_B(flag, data):
"""B进程函数"""
while True:
if flag.value == 1: # 若标志为0
time.sleep(1)
for i in range(len(data)):
data[i] -= 1 # 共享数组各元素减1
flag.value = 0 # 置标志为0
print([item for item in data])
if __name__ == '__main__':
print('主进程(%s)开始,按回车键结束本程序'%os.getpid())
flag = mp.Value('i', 0) # flag类型是ctypes.c_long,不是普通的int
data = mp.Array('d', range(5))
p_a = mp.Process(target=sub_process_A, args=(flag, data))
p_a.daemon = True
p_a.start()
p_b = mp.Process(target=sub_process_B, args=(flag, data))
p_b.daemon = True
p_b.start()
input()