multiprocessing.cpu_count()
, можно определить количество ядер процессора и передать это значение в конструктор multiprocessing.Pool
. Пример:
import multiprocessing
num_processes = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes=num_processes)
# Дальнейшая работа с пулом, например:
# results = pool.map(my_function, data)
# pool.close()
# pool.join()
Здесь num_processes
будет содержать количество ядер CPU, а пул будет создан с соответствующим количеством рабочих процессов. Важно помнить о вызове pool.close()
и pool.join()
после завершения работы с пулом.
Использование multiprocessing.cpu_count()
для динамического создания пула процессов позволяет эффективно задействовать все доступные ядра процессора, оптимизируя параллельное выполнение задач.
Вот пример кода, демонстрирующий, как это сделать:
import multiprocessing
from multiprocessing import Pool
import time
def worker_function(task_id):
"""Функция, выполняемая каждым процессом в пуле."""
print(f"Process {multiprocessing.current_process().name} executing task {task_id}")
time.sleep(1) # Имитация выполнения задачи
return f"Result from task {task_id}"
def main():
# Получаем количество доступных ядер CPU
num_processes = multiprocessing.cpu_count()
print(f"Number of CPUs: {num_processes}")
# Создаем пул процессов с использованием multiprocessing.cpu_count()
with Pool(processes=num_processes) as pool:
# Определяем задачи для выполнения (в данном случае, список чисел)
tasks = range(10)
# Запускаем задачи в пуле процессов
results = pool.map(worker_function, tasks)
# Закрываем пул (предотвращает добавление новых задач)
pool.close()
# Дожидаемся завершения всех процессов в пуле
pool.join()
# Выводим результаты
print("Results:")
for result in results:
print(result)
if __name__ == "__main__":
main()
Пояснения:
multiprocessing.cpu_count()
возвращает количество логических ядер CPU в системе. Это число используется для определения размера пула.multiprocessing.Pool(processes=num_processes)
создает пул процессов. Параметр processes
определяет количество процессов в пуле.pool.map(worker_function, tasks)
применяет функцию worker_function
к каждому элементу в списке tasks
, распределяя выполнение между процессами в пуле. Результаты возвращаются в виде списка. Важно отметить, что pool.map
подходит для случаев, когда порядок результатов важен и должен соответствовать порядку входных данных.pool.close()
закрывает пул, предотвращая добавление новых задач. Важно вызвать эту функцию после отправки всех задач.pool.join()
ожидает завершения всех процессов в пуле. Важно вызвать эту функцию после pool.close()
.worker_function
– это пример задачи, которая будет выполняться каждым процессом. В реальных приложениях это может быть любая вычислительно-интенсивная операция.Альтернативные методы:
Вместо pool.map()
можно использовать другие методы пула:
pool.apply(func, args)
: Запускает функцию func
с аргументами args
в одном из процессов пула. Выполнение блокируется до завершения функции. Обычно используется для небольшого количества задач, не требующих параллельной обработки.pool.apply_async(func, args)
: Запускает функцию func
с аргументами args
асинхронно в одном из процессов пула. Возвращает объект AsyncResult
, который можно использовать для получения результата позже. Подходит для задач, которые могут выполняться независимо друг от друга.pool.imap(func, iterable)
: Аналогично pool.map
, но возвращает итератор результатов. Позволяет обрабатывать результаты по мере их поступления, без необходимости ожидания завершения всех задач.pool.imap_unordered(func, iterable)
: Аналогично pool.imap
, но порядок результатов не гарантируется. Может быть немного быстрее, если порядок не важен.Выбор подходящего метода зависит от конкретных требований к порядку выполнения и обработке результатов.