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, но также означает, что могут быть выполнены и возвращены только выбираемые объекты.

  • Как установить модуль Python без setup.py?
  • Колба разбитая труба с запросами
  • Нет окна графика в matplotlib
  • Как установить версию пакета python3 через pip на Ubuntu?
  • Непризнанная проблема службы супервизора после установки
  • Объект AttributeError: '_socketobject' не имеет атрибута 'set_tlsext_host_name'
  • Как я могу найти альфа-форму (вогнутый корпус) облака 2d-точки?
  • сервер selenium, клиент selenium, на сервере GUI UBUNTU
  •  
    Interesting Posts for Van-Lav

    Обновление переменных .bashrc и среды во время резервного копирования Vagrant

    Как создать DataFrame из строк при сохранении существующей схемы?

    PyCharm не будет правильно открывать графики matplotlib

    Многократное наследование Python: выбор, который super () вызывает

    Формат декомпрессии Python

    Pyspark: пользовательская функция окна

    Флажок – 500 Внутренняя ошибка сервера

    Сравните две матрицы разных размеров, чтобы сделать одну большую матрицу – Улучшения скорости?

    Динамические задачи Celery / скрытие реализации Celery за интерфейсом

    Печать в одну строку, а не новую строку в python

    Напишите скрипт python, который рекурсивно просматривает ссылки на странице

    Применить повторную выборку для каждой группы в объекте groupby

    multiprocessing.Pool зависает, если дочерний элемент вызывает ошибку сегментации

    Анализ двоичных данных в ctypes Структурный объект через readinto ()

    Сгенерируйте тепловую карту в MatPlotLib, используя набор данных рассеяния

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