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

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

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

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

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

Похожие вопросы
Greenway Global Новосибирск
от 150 000 ₽
SPA2099 Москва
До 100 000 ₽
HR Prime Москва
от 300 000 до 3 800 000 ₽