Python 2.7 concurrent.futures.ThreadPoolExecutor не распараллеливает

Я запускаю следующий код на компьютере с процессором Intel i3 с 4 виртуальными ядрами (2 гиперпотока / физическое ядро, 64 бит) и Ubuntu 14.04:

n = multiprocessing.cpu_count() executor = ThreadPoolExecutor(n) tuple_mapper = lambda i: (i, func(i)) results = dict(executor.map(tuple_mapper, range(10))) 

Код, похоже, не выполняется параллельно, так как процессор используется только 25% постоянно. На графике использования только один из 4 виртуальных ядер используется на 100% за раз. Используемые ядра чередуются каждые 10 секунд или около того.

Но распараллеливание хорошо работает на серверной машине с одинаковой настройкой программного обеспечения. Я не знаю точного количества ядер или точного типа процессора, но я точно знаю, что он имеет несколько ядер, а его использование составляет 100%, а вычисления имеют быстрое ускорение (в 10 раз быстрее после использования распараллеливания некоторые эксперименты с ним).

Я ожидаю, что распараллеливание будет работать и на моей машине, не только на сервере.

Почему это не работает? Имеет ли это какое-то отношение к моим настройкам операционной системы? Нужно ли менять их?

Заранее спасибо!

Обновление: для получения справочной информации см. Правильный ответ ниже. Для полноты я хочу дать пример кода, который решил проблему:

 tuple_mapper = lambda i: (i, func(i)) n = multiprocessing.cpu_count() with concurrent.futures.ProcessPoolExecutor(n) as executor: results = dict(executor.map(tuple_mapper, range(10))) 

Прежде чем повторно использовать это, позаботьтесь о том, чтобы все функции, которые вы используете, были определены на верхнем уровне модуля, как описано здесь: Ошибка трассировки многопроцессорной обработки Python

One Solution collect form web for “Python 2.7 concurrent.futures.ThreadPoolExecutor не распараллеливает”

Похоже, вы видите результаты Global Interpreter Lock Python (он же GIL).

В CPython блокировка глобального интерпретатора, или GIL, является мьютеком, который предотвращает одновременное выполнение несколькими собственными потоками байт-кодов Python.

Поскольку все ваши потоки работают с чистым кодом Python, только один из них может работать параллельно. Это должно привести к тому, что только один процессор будет активным и будет соответствовать вашему описанию проблемы.

Вы можете обойти его, используя несколько процессов с ProcessPoolExecutor из того же модуля. Другие решения включают переход на Jython или IronPython, у которых нет GIL.

Класс ProcessPoolExecutor – это подкласс Executor, который использует пул процессов для выполнения асинхронных вызовов. ProcessPoolExecutor использует модуль многопроцессорности, который позволяет ему блокировать глобальную блокировку Interpreter, но также означает, что могут быть выполнены и возвращены только выбираемые объекты.

  • Как «заблокировать клавиатуру», чтобы предотвратить отправку других нажатий на X11 / Linux / Gnome?
  • Объект AttributeError: '_socketobject' не имеет атрибута 'set_tlsext_host_name'
  • Ubuntu: невозможно устранить проблемы, у вас есть сломанные пакеты
  • Установка модулей python на Ubuntu
  • Отключенные кнопки Qt не отображаются как отключенные в Plasma 5.2 (KDE 5)
  • Python не работает: ImportError: нет модуля с именем 'logging'
  • Как установить версию пакета python3 через pip на Ubuntu?
  • Ubuntu 13.10: No Module Named appindicator
  • Python - Selenium в Ubuntu OSError: Не каталог
  • Virtualenv, no-site-packages, sys.path
  • Не удалось импортировать MongoClient
  •  
    Interesting Posts for Van-Lav

    Запуск нескольких пауков с использованием scrapyd

    Преобразование из вложенных списков в строку с разделителями

    Python: имя 'math' не определено Ошибка?

    рекурсивный dircmp (сравните два каталога, чтобы они имели одинаковые файлы и подкаталоги)

    PIP Install Numpy выдает ошибку «ascii-кодек не может декодировать байт 0xe2»

    Python: объединить (или клонировать) массив numpy N раз

    Как применять различные функции к объекту groupby?

    Тестирование загрузки файлов с помощью Flask и Python 3

    Получите «бит» для float в Python?

    Производить контент неограниченно в отдельном потоке для всех подключений?

    Python: Возможно ли изменить текущий каталог оболочки командной строки Windows без изменения текущего текущего каталога?

    Установить значения на диагонали pandas.DataFrame

    Статические члены класса python

    Проверьте, соответствуют ли текущие требования

    Использование Beautiful Soup для преобразования атрибутов CSS в отдельные атрибуты HTML?

    Python - лучший язык программирования в мире.