我尝试并行化一个程序,该程序在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
答案 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作业的例子。
使用管道或共享内存来处理总和,两者都在上面提到的多处理文档中有详细说明。