如何在Python中并行运行N个线程的相同函数但使用不同参数?
在这个链接中,提到我可以通过指定两个队列来同时运行两个函数。
from threading import Thread
from Queue import Queue
def func1(x):
return [i*i for i in x]
nums1 = [1,2,3,4,5]; nums2 = [112,32,53,64,25]
def wrapper(func, arg, queue):
queue.put(func(arg))
q1, q2 = Queue(), Queue()
Thread(target=wrapper, args=(func1, nums1, q1)).start()
Thread(target=wrapper, args=(func1, nums2, q2)).start()
print q1.get(), q2.get()
如何同时运行N个线程,使用相同的函数但不同的参数呢?
现在,我是直接写死代码,做的是:
nums1 = [1,2,3,4,5]; nums2 = [112,32,53,64,25]
nums3 = [11,522,33,467,85]; nums4 = [12,2,5,4,1125]
q1, q2, q3, q4 = Queue(), Queue(), Queue(), Queue()
Thread(target=wrapper, args=(func1, nums1, q1)).start()
Thread(target=wrapper, args=(func1, nums2, q2)).start()
Thread(target=wrapper, args=(func1, nums3, q3)).start()
Thread(target=wrapper, args=(func1, nums4, q4)).start()
print q1.get(), q2.get(), q3.get()
1 个回答
4
队列是线程安全的。这意味着你可以使用两个队列,让所有线程共享这些队列,应该不会有问题:
from threading import Thread
from multiprocessing import Queue
def func1(x):
return [i*i for i in x]
nums = [1,2,3,4,5,112,32,53,64,25]
def wrapper(func, qIn, qOut):
for arg in iter(qIn.get, None):
qOut.put(func(arg))
qIn, qOut = Queue(), Queue()
chunksize = len(nums)/numThreads
for i in xrange(numThreads):
qIn.put(nums[i*chunksize : (i+1)*chunksize])
numThreads = 2 # or N
for _ in xrange(numThreads):
qIn.put(None)
for _ in xrange(numThreads):
Thread(target=wrapper, args=(func1, qIn, qOut)).start()
for _ in xrange(numThreads):
print qOut.get()