Форум сайта python.su
Ковыряю одну багу, соответсвенно, решил на чистом примере потестить этот класс:
import multiprocessing from multiprocessing.pool import ThreadPool from time import sleep def do_calculation(data): sleep(10) return data * 2 if __name__ == '__main__': pool_size = multiprocessing.cpu_count() * 4 # pool_size = 2 print pool_size pool = ThreadPool(processes=pool_size) inputs = list(range(10)) print 'Input :', inputs pool_outputs = pool.map(do_calculation, inputs) print 'Pool :', pool_outputs
ps awux -L | grep test_threadpool
print pool_size
sergius 31269 31269 1.0 8 0.0 65688 3940 pts/3 Sl+ 18:07 0:00 python test_threadpool.py sergius 31269 31270 0.0 8 0.0 65688 3940 pts/3 Sl+ 18:07 0:00 python test_threadpool.py sergius 31269 31271 0.0 8 0.0 65688 3940 pts/3 Sl+ 18:07 0:00 python test_threadpool.py sergius 31269 31272 0.0 8 0.0 65688 3940 pts/3 Sl+ 18:07 0:00 python test_threadpool.py sergius 31269 31273 0.0 8 0.0 65688 3940 pts/3 Sl+ 18:07 0:00 python test_threadpool.py sergius 31269 31274 0.0 8 0.0 65688 3940 pts/3 Sl+ 18:07 0:00 python test_threadpool.py sergius 31269 31275 0.0 8 0.0 65688 3940 pts/3 Sl+ 18:07 0:00 python test_threadpool.py sergius 31269 31276 0.0 8 0.0 65688 3940 pts/3 Sl+ 18:07 0:00 python test_threadpool.py
Отредактировано Master_Sergius (Окт. 2, 2015 18:52:17)
Офлайн
Master_SergiusИнтересно а зачем? В системе живут сотни тредов, одним меньше одни больше какая разница?
Вот эту загадку мне надо решить
Офлайн
Ну хотя бы потому, что в продукте вообще не видно какой-то зависимости. Если б там тоже +3 или +4 стабильно на любых значениях - фиг с ним. Я просто ищу всевозможные варианты, где может быть такое расхождение непонятное.
Всё же, некоторая зависимость имеется:
кол-во указанных / кол-во при выводе ps -L
1 / 11
2 / 14
3 / 17
4 / 20
5 / 23
6 / 26
7 / 29
8 / 32
Тобишь, когда +1 добавляем в инициализацию ThreadPool, то на выходе +3. Значит, надо ковырять дальше сам продукт, где ещё завязано…
Отредактировано Master_Sergius (Окт. 2, 2015 19:21:00)
Офлайн
я вот бегло глянул код… допустим у вас 4 ядра, пул делаете размером 4*4=16 , а вот задач у вас range(10) то есть 10 … итого на 10 задач 16 процессов, т.е. 6 будут сразу же закрыты за неимением задач…
Офлайн
JOHN_16
я вот бегло глянул код… допустим у вас 4 ядра, пул делаете размером 4*4=16 , а вот задач у вас range(10) то есть 10 … итого на 10 задач 16 процессов, т.е. 6 будут сразу же закрыты за неимением задач…
pool_size = 2
def do_calculation(data): print "calculating" sleep(10) return data * 2
calculating calculating
Офлайн
Ок. Смотрим на исходный код /usr/lib/python2.7/multiprocessing/pool.py
А именно на инициализатор класса Pool. Видим мы там, что во время выполнения __init__ метода создается 3 внутренних объекта Thread: self._worker_handler, self._task_handler, self._result_handler.
Проверяем практикой - вызываем python, ps сообщает что у нас 1 поток python, создаем пул с pool_size=2, ps сообщает нам о 6 потоках, а именно 1+2+3 (основной поток программы, два созданных нами, 3 внутренних потока объекта Pool).
Создаем Pool с pool_size=16, получаем 20 потоков 1+3+16=20
Т.о. при создании 1 Pool экземпляра будет порождено еще 3 дополнительных потока, можно считать их служебными.
Master_Sergius Думаю вопрос решен?
Офлайн
Спасибо, что не поленился, добрый молодец. Я же что-то не подумал посмотреть в Pool, меня сбило с толку то, что в ThreadPool импортируется dummy Process, который подменяет Process для Pool, вот я и смотрел туда, а тут вот оно чё, михалыч. В общем, спасибо, кажется, Я даже догадываюсь где теперь кроется проблема и в самом продукте
Офлайн