如何在多处理参数中使用函数指针

时间:2014-06-01 01:38:09

标签: python function process point

我有几个使用相同参数的函数,如下所示

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 个答案:

答案 0 :(得分:1)

首先有一些语法错误:

  • 没有:结束functiton定义标题。

    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()