首页 > 解决方案 > 如何从两个不同的函数将值附加到同一个数组?

问题描述

当前代码

import multiprocessing as mu
import time

global_array=[]

def add_array1(array):
    while True:
        time.sleep(2.5)
        global_array.append(1)

        print(global_array)

def add_array2(array):
    while True:
        time.sleep(3)
        global_array.append(2)

        print(global_array)

def runInParallel(*fns):
      if __name__=='__main__':
        proc = []
      for fn in fns:
        p = mu.Process(target=fn)
        p.start()
        proc.append(p)
      for p in proc:
        p.join()

runInParallel(
    add_array1(global_array),
    add_array2(global_array)
    )

在上面运行我的代码时,只有第一个函数add_array1()将值附加到数组并打印,而不是两个函数都提供错误的输出:

[1]
[1,1]
[1,1,1]

当以下代码的实际所需输出为:

[1]
[1,2]
[1,2,1]
[1,2,1,2]

标签: python

解决方案


你的问题是函数调用

runInParallel( add_array1(global_array), add_array2(global_array)) 

执行函数并将函数调用的返回值作为参数提供给runInParallel. 作为add_array1一个无限循环,它永远不会从执行中返回。您需要将函数作为函数提供- 而不是函数的返回值作为参数runInParallel(...)

从...开始

runInParallel( add_array1, add_array2) # name of the functions, dont execute em

和改变

def runInParallel(*fns): 
    proc = []
    for fn in fns:
        p = mu.Process(target=fn, args=(global_array,)) # provide param here
        p.start()
        proc.append(p)
    for p in proc:
        p.join()

然后修复由于您的线程函数永远不会返回的“不加入”问题。


来自multiprocessing.Process 官方文档的示例:

from multiprocessing import Process 
import os

def info(title):
    print(title)
    print('module name:', __name__)
    print('parent process:', os.getppid())
    print('process id:', os.getpid())

# Function name is f
def f(name):
    info('function f')
    print('hello', name)

if __name__ == '__main__':
    info('main line')
    # f is provided, and args is provided - not f("bob")
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()

推荐阅读