У меня небольшие проблемы с параллельной обработкой в Python. Я совершенно новичок в концепции параллельных вычислений. Я использую многопроцессорность, которая поставляется со стандартным Python.
У меня 12 тем на моем компьютере. Я прошу 12 рабочих, но я не всегда могу получить всех рабочих, которых я прошу. Моя проблема возникает, когда я не получаю доступ к такому количеству работников, которое мне нужно для обработки числа задач nTasks в моем коде ниже (в настоящее время установлено четыре). То, что происходит тогда, это просто то, что код застревает и никогда не попадает в то, что находится под комментарием «# Get Results». Кажется случайным, сколько рабочих я получаю (я всегда спрашиваю 12), но проблема возникает, когда я получаю трех или менее рабочих в следующем коде:
import multiprocessing as mp
import scipy as sp
import scipy.stats as spstat
import pylab
def testfunc(x0, N):
print 'working with x0 = %s' % x0
x = [x0]
for i in xrange(1,N):
x.append(spstat.norm.rvs(size = 1)) # stupid appending to make it slower
if i % 10000 == 0:
print 'x0 = %s, i = %s' % (x0, i)
return sp.array(x)
def testfuncParallel(fargs):
return testfunc(*fargs)
pool = mp.Pool(12) # I have 12 threads
nTasks = 4
N = 100000
tasks = [(x, n) for x, n in enumerate(nTasks*[N])] # nTasks different tasks
result = pool.map(testfuncParallel, tasks)
pool.close()
pool.join()
# Get results:
sim = sp.zeros((N, nTasks))
for nn, res in enumerate(result):
sim[:, nn] = res
pylab.figure()
for i in xrange(nTasks):
pylab.subplot(nTasks,1, i + 1)
pylab.plot(sim[:, i])
pylab.show()
Я пытался использовать pool.map_async вместо pool.map, но не могу обойти проблему.
Заранее спасибо,
С уважением,
Matias