Python, многопоточность слишком медленная, многопроцессорная - PullRequest
5 голосов
/ 08 января 2012

Я новичок в многопроцессорной среде,

Я кое-что знаю о многопоточности, но мне нужно увеличить скорость вычислений, надеюсь, с помощью многопроцессорной обработки:

Пример Описание: отправляет строку в поток, изменяет строку + тест производительности, отправить результат обратно на печать.

from threading import Thread

class Alter(Thread):
    def __init__(self, word):
        Thread.__init__(self)
        self.word = word
        self.word2 = ''

    def run(self):
        # Alter string + test processing speed
        for i in range(80000):
            self.word2 = self.word2 + self.word

# Send a string to be altered
thread1 = Alter('foo')
thread2 = Alter('bar')
thread1.start()
thread2.start()

#wait for both to finish
while thread1.is_alive() == True: pass
while thread2.is_alive() == True: pass


print(thread1.word2)
print(thread2.word2)

В настоящее время это занимает около 6 секунд, и мне нужно, чтобы он шел быстрее.
Я изучал многопроцессорность и не могу найти что-то эквивалентное приведенному выше коду. Я думаю, что я ищу, это объединение , но примеры, которые я нашел, было трудно понять. Я хотел бы воспользоваться всеми ядрами (8 ядер) multiprocessing.cpu_count(), но у меня действительно есть клочки полезной информации о многопроцессорной обработке и ее недостаточно для дублирования вышеуказанного кода. Если кто-то может указать мне правильное направление или еще лучше, приведите пример, который был бы очень признателен. Python 3, пожалуйста

1 Ответ

6 голосов
/ 08 января 2012

Просто замените threading на multiprocessing и Thread на Process. Потоки в Pyton (почти) никогда не используются для увеличения производительности из-за большого плохого GIL! Я объяснил это в другом SO-посте с некоторыми ссылками на документацию и отличным разговором о многопоточности в python.

Но многопроцессорный модуль намеренно очень похож на модуль потоков. Вы можете почти использовать его как замену!

Модуль многопроцессорной обработки не предоставляет AFAIK функциональность, обеспечивающую использование определенного количества ядер. Он опирается на OS-реализацию. Вы можете использовать объект «Пул» и ограничить количество рабочих-объектов количеством ядер. Или вы можете найти другую библиотеку MPI, такую ​​как pypar. В Linux вы можете использовать канал под оболочкой для запуска нескольких экземпляров на разных ядрах

...