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()
Другие вопросы по тегам