Многопоточность внутри многопроцессорности в Python - PullRequest
0 голосов
/ 19 июня 2020

Я использую модуль concurrent.futures для многопроцессорной обработки и многопоточности. Я запускаю его на 8-ядерном компьютере с 16 ГБ оперативной памяти, процессором Intel i7 8-го поколения. Я пробовал это на Python 3.7.2 и даже на Python 3.8.2

import concurrent.futures
import time
берет список и умножает каждый элемент на 2
def double_value(x):
  y = []
  for elem in x:
    y.append(2 *elem)
  return y
умножает элемент на 2
def double_single_value(x):
  return 2* x
определяет функцию
import numpy as np
a = np.arange(100000000).reshape(100, 1000000)
для запуска нескольких потоков и нескольких элементов на 2
 def get_double_value(x):
  with concurrent.futures.ThreadPoolExecutor() as executor:
    results = executor.map(double_single_value, x)
  return list(results)

, показанный ниже код выполняется за 115 секунд. Это использует только многопроцессорность. Использование ЦП для этого фрагмента кода составляет 100%

t = time.time()

with concurrent.futures.ProcessPoolExecutor() as executor:
  my_results = executor.map(double_value, a)
print(time.time()-t)

Функция, приведенная ниже, заняла более 9 минут и потребила всю оперативную память системы, а затем система завершила весь процесс. Кроме того, загрузка ЦП во время этого фрагмента кода не достигает 100% (~ 85%)

t = time.time()
with concurrent.futures.ProcessPoolExecutor() as executor:
  my_results = executor.map(get_double_value, a)

print(time.time()-t)

Я действительно хочу понять:

1) почему код, который сначала разбивается, выполняет многократную обработку а затем запустите пробную многопоточность, не работает быстрее, чем код, который запускает только многопроцессорность? Потоковая обработка предназначена для процессов ввода-вывода и многопроцессорности для процессов ЦП?) 2) Есть ли лучший способ сделать многопоточность внутри многопроцессорной обработки для максимального использования выделенного ядра (или ЦП)?

3) Почему последний фрагмент кода занимал всю оперативную память? Это было из-за многопоточности?

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

Использование потоковой передачи в чистом Python для проблем, связанных с процессором, - плохой подход, независимо от того, используется ли многопроцессорность или нет. Попробуйте переделать свое приложение, чтобы использовать только многопроцессорность или сторонние библиотеки, такие как Dask и т. Д.

0 голосов
/ 19 июня 2020

Как вы говорите: «Я просмотрел много сообщений, описывающих многопроцессорность и многопоточность, и одна из проблем, которые у меня возникли, - это многопоточность для процессов ввода-вывода и многопроцессорность для процессов ЦП».

Вам нужно выяснить, привязана ли ваша программа к вводу-выводу или к ЦП, и применить правильный метод для решения вашей проблемы. Применение различных методов наугад или всех вместе одновременно, как правило, только ухудшает ситуацию.

...