@maryaTurova

Pool vs ThreadPool или как задействовать все процессоры с максимальной отдачей?

ThreadPool
from multiprocessing.dummy import Pool as ThreadPool

def get_img(_id):
	response = session.get(URL+'/images/'+_id+'.json')
	# здесь получение словаря в котором имеется картинка в формате base64.
	# Далее код по обработке img и отправке на сервер Flask
	
# Запрос на получение списка путей файлов
response = session.get(URL, verify=False, timeout=5)
if response.status_code == 200:
	arr_obj = json.loads(response.text)
	if arr_obj:
		tasks = [_id for _id in arr_obj]
		pool = ThreadPool()
		pool.imap(get_img, tasks)

Pool
from multiprocessing.pool import Pool

def get_img(_id):
	response = session.get(URL+'/images/'+_id+'.json')
	# здесь получение словаря в котором имеется картинка в формате base64.
	# Далее код по обработке img и отправке на сервер Flask
	
# Запрос на получение списка путей файлов
response = session.get(URL, verify=False, timeout=5)
if response.status_code == 200:
	arr_obj = json.loads(response.text)
	if arr_obj:
		tasks = [_id for _id in arr_obj]
		with Pool() as pool:
			result_pool = pool.map(get_img, tasks)

ThreadPool как я понимаю использует один процессор,или ошибаюсь? Данный вариант мне не совсем подходит, т.к. надо получать и обрабатывать много картинок, в принципе из-за этого решил использовать imap вместо map, чтобы не дожидаться завершения всех потоков.
Pool запускает все процессы, но всё происходит так долго......по ощущениям что в десятки раз уступает по скорости с ThreadPool .
Вообщем вопрос следующий:
- Что мне поправить чтобы использовать по максимуму процессов и потоков? Ну или как я могу обрабатывать большой объем картинок используя макс. возможности ПК?
PS: Flask выдает результат от обученной модели tf. и на скорость практически не влияет.
  • Вопрос задан
  • 193 просмотра
Решения вопроса 3
@mgearr
Ну а как вообще запускать параллельные треды на питоне?
На чистом питоне - видимо, никак. Ведь именно для того знаменитый GIL и сделали, чтоб нельзя было. На C и CPython - можно, но это уже выход за рамки питона

Стандартный питоновский путь - вместо тредов использовать процессы. При этом, естественно, расходуется больше памяти и прочих ресурсов, зато легче избегать конфликтов чтения-записи (race conditions)

Также можно поискать библиотеки с распараллеливанием нужной задачи. Или можно просто запускать внешние процессы, которые "умеют в треды". Причём всё равно лучше это делать через пул процессов, потому что проц хорошо нагружается, если процессов больше, чем ядер/потоков. Размер пула надо подбирать опытным путём, потому что с какого-то количества одновременных задач общая производительность начнёт падать из-за перегрузки планировщика и ввода-вывода
Ответ написан
Комментировать
@rPman
модели tf
tensorflow по умолчанию пытается использовать все доступное (и настроенное) оборудование, т.е. если у тебя анализ идет на процессоре, по умолчанию будут задействованы все ядра

Использование пула скорее всего никакого прироста к скорости не даст (максимум время на подготовку данных к нужному формату)
Ответ написан
HemulGM
@HemulGM Куратор тега Python
Delphi Developer, сис. админ
Не использовать питон
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы