如何平行地在循环上运行单个函数? Python 2.7.12

时间:2016-10-18 16:19:40

标签: python parallel-processing

我尝试并行化一个程序,该程序在for循环中使用单个函数并行地更新全局列表/变量。我该如何解决这个问题?如何将值传递给函数?

示例代码如下所示,

#python 2.7.12
import random
sum=0

#sample function to take a random integer between 0 to i and add it to global variable sum
def hello(i):
    print "Thread Id :",i   #instead of i it should be the threadID
    sum=sum+random.randrange(0,i)

#main function  
i=1
for i in range(10): 
    hello(i)        #how to parallelize this function over a loop?

编辑1: 尝试使用多处理过程,但不知道如何将值传递给函数以及如何在循环中并行运行它。

from multiprocessing import Process
sum=0 

def Hello(): 
   print 'hello: starting' 
   sum=sum+i    #Don't know how to pass values here 
   print 'hello: finishing' 

if name == 'main': 
   p1 = Process(target=func1) 
   p1.start() 
   p1.join()
   print sum

2 个答案:

答案 0 :(得分:2)

你可以使用multiprocessing.dummy.Pool,它接受你的参数后面的函数(见下文)。

您还需要担心全局变量的同步(请参阅下面的示例,了解如何使用Lock)。

此外,除非使用“全局和”,否则函数内的和将引用局部求和变量(请参阅下面的全局求和示例)。

threading.current_thread()为您提供线程ID。

#python 2.7.12
from multiprocessing.dummy import Pool as ThreadPool
import threading
import random

lock = threading.Lock()

sum = 0

#sample function to take a random integer between 0 to i and add it to global variable sum
def hello(i):
    if (i == 0):
        return
    global sum
    print threading.current_thread()   #instead of i it should be the threadID
    r = random.randrange(0,i)
    lock.acquire()
    try:
        sum = sum + r
    finally:
        lock.release()

ThreadPool().map(hello, list(range(1, 11)))

print sum

答案 1 :(得分:0)

将参数作为元组传递给Process函数的args kwarg:以下是文档中的示例:

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()

https://docs.python.org/2/library/multiprocessing.html

John Gordon在评论中所说的也是如此。您需要让主进程(将运行循环)处理求和。你基本上要做的是一个简单的map / reduce工作。

地图部分是你的hello函数,reduce是总和。在python中有很多做map / reduce作业的例子。

使用管道或共享内存来处理总和,两者都在上面提到的多处理文档中有详细说明。