Многопроцессорность Python использует только одно ядро

Я пытаюсь найти фрагмент кода из стандартной документации python, чтобы узнать, как использовать модуль многопроцессорности. Код вставляется в конце этого сообщения. Я использую Python 2.7.1 на Ubuntu 11.04 на четырехъядерном процессоре (который, согласно системному монитору, дает мне восемь ядер из-за гиперпоточности)

Проблема: вся рабочая нагрузка, по-видимому, рассчитана на одно ядро, которое приближается к 100% использованию, несмотря на то, что запущено несколько процессов. Иногда вся рабочая нагрузка мигрирует в другое ядро, но рабочая нагрузка никогда не распределяется между ними.

Есть идеи, почему это так?

С наилучшими пожеланиями,

Павел

# # Simple example which uses a pool of workers to carry out some tasks. # # Notice that the results will probably not come out of the output # queue in the same in the same order as the corresponding tasks were # put on the input queue. If it is important to get the results back # in the original order then consider using `Pool.map()` or # `Pool.imap()` (which will save on the amount of code needed anyway). # # Copyright (c) 2006-2008, R Oudkerk # All rights reserved. # import time import random from multiprocessing import Process, Queue, current_process, freeze_support # # Function run by worker processes # def worker(input, output): for func, args in iter(input.get, 'STOP'): result = calculate(func, args) output.put(result) # # Function used to calculate result # def calculate(func, args): result = func(*args) return '%s says that %s%s = %s' % \ (current_process().name, func.__name__, args, result) # # Functions referenced by tasks # def mul(a, b): time.sleep(0.5*random.random()) return a * b def plus(a, b): time.sleep(0.5*random.random()) return a + b def test(): NUMBER_OF_PROCESSES = 4 TASKS1 = [(mul, (i, 7)) for i in range(500)] TASKS2 = [(plus, (i, 8)) for i in range(250)] # Create queues task_queue = Queue() done_queue = Queue() # Submit tasks for task in TASKS1: task_queue.put(task) # Start worker processes for i in range(NUMBER_OF_PROCESSES): Process(target=worker, args=(task_queue, done_queue)).start() # Get and print results print 'Unordered results:' for i in range(len(TASKS1)): print '\t', done_queue.get() # Add more tasks using `put()` for task in TASKS2: task_queue.put(task) # Get and print some more results for i in range(len(TASKS2)): print '\t', done_queue.get() # Tell child processes to stop for i in range(NUMBER_OF_PROCESSES): task_queue.put('STOP') test() 

4 Solutions collect form web for “Многопроцессорность Python использует только одно ядро”

Некоторые из них были изменены. Раньше у меня была эта проблема с numpy. Я нашел решение здесь http://bugs.python.org/issue17038#msg180663

многопроцессорность не означает, что вы будете использовать все ядра процессора, вы просто получите несколько процессов, а не многоядерные процессы, это будет обрабатываться ОС и не определено, вопрос @Devraj, размещенный на комментариях, имеет ответы, чтобы выполнить то, что вы желание.

Я нашел работу с использованием Parallel Python. Я знаю, что это не решение, использующее базовые библиотеки Python, но код прост и работает как шарм

Попробуйте заменить time.sleep тем, что на самом деле требует процессоров, и вы увидите, что multiprocess работает просто отлично! Например:

 def mul(a, b): for i in xrange(100000): j = i**2 return a * b def plus(a, b): for i in xrange(100000): j = i**2 return a + b 
  • Как правильно установить python-numpy в Ubuntu 11.10 Oneiric
  • Как я могу сделать фальшивую «активную сессию» для gconf?
  • Python не работает: ImportError: нет модуля с именем 'logging'
  • Отображение gtk.Calendar в меню?
  • где django установить в ubuntu
  • Запуск Python очень медленный на сервере Linux ... но быстро на Linux-разработке VM?
  • как удалить django из ubuntu?
  • Как подключиться к Windows SQL Server от Ubuntu
  • Python - лучший язык программирования в мире.