如何在多进程参数中使用函数指针

1 投票
1 回答
719 浏览
提问于 2025-04-18 08:10

我有几个函数,它们使用的参数是一样的,如下所示:

def cat(time , dist)
    return random.randint(1, 400) * time + random.randint(1, 5) * dist

def dog(time , dist)
    return random.randint(1, 300) * time + random.randint(1, 7) * dist

def rabbit(time , dist)
    return random.randint(1, 200) * time + random.randint(1, 3) * dist

def turtle(time , dist)
    return random.randint(1, 100) * time + random.randint(1, 1) * dist


if __name__ == '__main__':
    FunArray = {
        1:cat
        2:dog
        3:rabbit
        4:turtle
    }
    pool = multiprocessing.Pool(processes=2)
    q=10
    for i in xrange(1,4):
        workers = pool.apply_async(FunArray[i], args=(i, q))
    pool.close()
    pool.join()

我只是想同时运行两个进程,并且想用一个函数指针来传递进程的函数名。但是,程序没有正常工作。

1 个回答

2

首先,这里有一些语法错误:

  • 函数定义的开头没有冒号 :

    def cat(time , dist):
                        ^
    
  • 字典里的每个项后面没有逗号 ,

    1:cat,
         ^
    
  • if __name__ == "__main__" 这个块应该缩进。

代码里没有导入 randommultiprocessing 的语句。

FuncArray 实际上是一个字典。

xrange(1, 4) 会产生 1, 2, 3(4不包括在内)。如果你想要得到 1, 2, 3, 4,你应该用 xrange(1, 5)。不过,我更喜欢直接用 enumerate 来遍历列表。

你需要保存工人的引用,以便后面能拿到结果。


import random
import multiprocessing

def cat(time , dist):
    return random.randint(1, 400) * time + random.randint(1, 5) * dist

def dog(time , dist):
    return random.randint(1, 300) * time + random.randint(1, 7) * dist

def rabbit(time , dist):
    return random.randint(1, 200) * time + random.randint(1, 3) * dist

def turtle(time , dist):
    return random.randint(1, 100) * time + random.randint(1, 1) * dist


if __name__ == '__main__':
    funcs = [cat, dog, rabbit, turtle]
    pool = multiprocessing.Pool(processes=2)
    q=10
    workers = []
    for i, func in enumerate(funcs):
        worker = pool.apply_async(func, args=(i, q))
        workers.append(worker)
    for worker in workers:
        print worker.get()
    pool.close()
    pool.join()

撰写回答