решено: проблема была в Wingware Python IDE. Я предполагаю, что естественный вопрос сейчас заключается в том, как это возможно и как это можно исправить.
Я задал вопрос вчера ( Проблема с многопроцессорной обработкой. Пул в Python ), и этот вопрос почти такой же, но я выяснил, что он работает на компьютере с Windows, а не в моей Ubuntu. В конце этого поста я опубликую немного другую версию кода, которая делает то же самое.
Краткое описание моей проблемы: при использовании multiprocessing.Pool в Python я не всегда могу получить количество рабочих, которых я запрашиваю. Когда это происходит, программа просто останавливается.
Я целый день работал над решением, а потом я подумал о комментарии Ноа по моему предыдущему вопросу. Он сказал, что он работает на его машине, поэтому я передал код своему коллеге, который работает на машине Windows с 64-битным дистрибутивом Python 2.7.1 Enthoughts. У меня то же самое с большой разницей, что мой работает на Ubuntu. Я также упоминаю, что у нас обоих есть Wingware Python IDE, но я сомневаюсь, что это имеет какое-то значение?
Есть две проблемы с моим кодом, которые не возникают, когда мой коллега запускает код на своем компьютере.
Я не всегда могу получить четырех рабочих, о которых я прошу (хотя в моей машине 12 рабочих). Когда это происходит, процесс просто останавливается и не продолжается. Нет исключений или возникла ошибка.
Когда я могу получить четырех рабочих, которых я запрашиваю (что происходит примерно 1 из 5 или около того), полученные цифры (простые случайные числа) Точно одинаковы для всех четырех изображений. Это не относится к моему коллеге.
Что-то очень подозрительно, и я очень благодарен за любую помощь, которую вы, ребята, можете предложить.
код:
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)
# Define Number of tasks.
nTasks = 4
N = 100000
if __name__ == '__main__':
"""
Try number 1. Using multiprocessing.Pool together with Pool.map_async
"""
pool = mp.Pool(processes = nTasks) # I have 12 threads (six cores) available so I am suprised that it does not get access to nTasks = 4 amount of workers
# Define tasks:
tasks = [(x, n) for x, n in enumerate(nTasks*[N])] # nTasks different tasks
# Compute parallel: async - asynchronically, i.e. not necessary in order.
result = pool.map_async(testfuncParallel, tasks)
pool.close() # These are needed if map_async is used
pool.join()
# Get results:
sim = sp.zeros((N, nTasks))
for nn, res in enumerate(result.get()):
sim[:, nn] = res
pylab.figure()
for i in xrange(nTasks):
pylab.subplot(nTasks,1, i + 1)
pylab.plot(sim[:, i])
pylab.show()
Заранее спасибо.
С уважением,
Matias