在Python循环的每个迭代中运行多个进程

km0tfn4u  于 2023-05-27  发布在  Python
关注(0)|答案(1)|浏览(220)

我有两个函数func_1func_2。它们都接受一个整数数组作为输入。
我有一个循环,在第i次迭代中创建长度为i的数组。
我有两个预定义的列表list_1list_2,用于存储每次迭代时函数的输出。
因此,对于每次迭代,我希望并行运行两个函数,并将迭代中创建的数组作为输入。CPython没有真正的多线程,所以我使用multiprocessing
我想在循环的每次迭代中为每个函数创建两个独立的进程,并在迭代结束时创建close进程。
到目前为止,我已经尝试使用PoolProcess。我无法让它们填充list_1list_2,即使通过将这两个列表作为参数发送给各自的函数,并将结果附加到函数中。
我如何做到这一点?将理解解释。
P.S.这是我实际代码的一个(非常)简化版本。
以下是我所做的不起作用的:

import random
import multiprocessing as mp

list_1 = []
list_2 = []

for input in range(n):
    arr_1 = [random.randint(0,100) for _ in range(input)]
    arr_2 = list(arr_1)
    proc_one = mp.Process(target=func_1, args=(arr_1, list_1)
    proc_two = mp.Process(target=func_2, args=(arr_2, list_2)
    
    proc_one.start()
    proc_two.start()
    
    proc_one.join()
    proc_two.join()
    
print(list_1)
print(list_2)

下面是两个函数:

def func_1(in, out):
    # do something with in
    # store the value in result
    out.append(result)
    
def func_2(in, out):
    # do something differnt with in
    # store the value in result
    out.append(result)
uz75evzq

uz75evzq1#

如果CPython不是强制性的,你可以使用python的多处理库。我认为这个方法可以和CPython一起工作。
创建共享队列

mp.Queue()

启动池中的进程,将共享队列作为参数传递,并传递您的数据

mp.Process(target= Your process, args= (Your shared Queue ,  Your Data ))

在进程端,您还应该在init函数中创建对共享队列的引用

def __init__(self,queue_shared, data):
        self.queue_shared = queue_shared

进程间共享状态
尝试使用文档或管理器中所述的Value和Array对象
下面是使用Array的代码示例

import random
import multiprocessing as mp
from multiprocessing import Array

list_1 = Array("i",range(10)) 
list_2 = Array("i", range(10))

def func_1(a, b):
    for i in range(len(a)):
            b[i] = -a[i]

def func_2(a, b):
    start = len(b) - 1
    for i in range(start, -1, -1):
        b[i] = random.randint(0,10) + a[i]

print("list_1 before", list_1[:])
print("list_2 before", list_2[:])

for input in range(1):
    lst = [random.randint(0,10) for _ in range(10)]
    arr_1 = Array("i",lst  )
    arr_2 =  Array("i",lst  )

    print("arr_1 before", arr_1[:])
    print("arr_2 before", arr_2[:])

    proc_one = mp.Process(target=func_1, args=(arr_1, list_1))
    proc_two = mp.Process(target=func_2, args=(arr_2, list_2))
    
    proc_one.start()
    proc_two.start()
    
    proc_one.join()
    proc_two.join()
    
print("list_1 after", list_1[:])
print("list_2 after", list_2[:])
print("arr_1 after", arr_1[:])
print("arr_2 after", arr_2[:])

这个应该能打印出这样的东西

list_1 before [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
list_2 before [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
arr_1 before [9, 9, 1, 6, 3, 0, 1, 4, 4, 0]
arr_2 before [9, 9, 1, 6, 3, 0, 1, 4, 4, 0]
list_1 after [-9, -9, -1, -6, -3, 0, -1, -4, -4, 0]
list_2 after [12, 19, 6, 7, 6, 6, 6, 4, 8, 6]
arr_1 after [9, 9, 1, 6, 3, 0, 1, 4, 4, 0]
arr_2 after [9, 9, 1, 6, 3, 0, 1, 4, 4, 0]

相关问题