Задать вопрос
@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. и на скорость практически не влияет.
  • Вопрос задан
  • 243 просмотра
Подписаться 2 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillbox
    Python-разработчик
    10 месяцев
    Далее
Решения вопроса 3
@mgearr
Ну а как вообще запускать параллельные треды на питоне?
На чистом питоне - видимо, никак. Ведь именно для того знаменитый GIL и сделали, чтоб нельзя было. На C и CPython - можно, но это уже выход за рамки питона

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

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

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

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

Похожие вопросы
от 100 000 до 150 000 ₽
Hard Bootstrapping LLC. Санкт-Петербург
от 250 000 до 500 000 ₽
НТЦ ПРОТЕЙ Санкт-Петербург
от 220 000 до 280 000 ₽