multiprocessing.Pool процессы привязаны к одному ядру
Я использую multiprocessing.Pool в Python на Ubuntu 12.04, и я столкнулся с любопытной проблемой; Когда я звоню map_async
в моем пуле я порождаю 8 процессов, но все они борются за доминирование над одним ядром моей 8-ядерной машины. Точно такой же код использует оба моих ядра в моем Macbook Pro и все четыре ядра моего другого рабочего стола Ubuntu 12.04 (по сравнению с htop
, во всех случаях).
Мой код слишком длинный, чтобы публиковать все, но важная часть:
P = multiprocessing.Pool()
results = P.map_async( unwrap_self_calc_timepoint, zip([self]*self.xLen,xrange(self.xLen)) ).get(99999999999)
P.close()
P.join()
ipdb.set_trace()
где unwrap_self_calc_timepoint
это функция-обертка для передачи необходимого self
аргумент к классу, основанный на рекомендации этой статьи.
Все три компьютера используют Python 2.7.3, и я не знаю, с чего начать, чтобы выяснить, почему этот компьютер Ubuntu работает. Любая помощь относительно того, как начать сужать проблему, была бы полезна. Спасибо!
1 ответ
У меня была та же проблема, в моем случае решение было заставить linux работать на всех процессорах, а не на одном: попробуйте добавить 2 следующие строки в начале вашего кода:
import os
os.system("taskset -p 0xfffff %d" % os.getpid())
Кажется, это довольно распространенная проблема между numpy и некоторыми дистрибутивами Linux. Мне не повезло с использованием набора задач в начале программы, но он работает, когда используется в распараллеливаемом коде:
import multiprocessing as mp
import numpy as np
import os
def something():
os.system("taskset -p 0xfffff %d" % os.getpid())
X = np.random.randn(5000,2000)
Y = np.random.randn(2000,5000)
Z = np.dot(X,Y)
return Z.mean()
pool = mp.Pool(processes=10)
out = pool.map(something, np.arange(20))
pool.close()
pool.join()