@anysofronova

Как заставить multiprocessing работать?

Задача: сделать 3 процесса (независимых), которые обращаются к одной функции с разными аргументами
Я сделала это с помощью threading, но потом поняла, что он использует только 1 ядро и процессы выполняются последовательно. Мне же нужно чтобы работало несколько ядер.
Я попробовала сделать так:
Phrase1 = Process(target = Noun_Phrase, name = 'pr_1', args = ('./wiki/wikido1.txt', './wiki/file_1.txt'))
Phrase2 = Process(target = Noun_Phrase, name = 'pr_2',args = ('./wiki/wikiot1do2.txt', './wiki/file_2.txt'))
Phrase3 = Process(target = Noun_Phrase, name = 'pr_3',args = ('./wiki/wikiot2.txt', './wiki/file_3.txt'))
Phrase1.start()
Phrase2.start()
Phrase3.start()
Phrase1.join()
Phrase2.join()
Phrase3.join()

но при выполнении запускается либо 1 процесс, либо вообще ошибка (каждый раз разные процессы запускаются) и я не могу понять в чем моя ошибка и как её исправить
помогите :с
  • Вопрос задан
  • 702 просмотра
Пригласить эксперта
Ответы на вопрос 3
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
import multiprocessing as mp

data = [
    ('./wiki/wikido1.txt', './wiki/file_1.txt'),
    ('./wiki/wikiot1do2.txt', './wiki/file_2.txt'),
    ('./wiki/wikiot2.txt', './wiki/file_3.txt'),
]

with mp.Pool(mp.cpu_count()) as pool:
    pool.starmap(Noun_Phrase, data)
Ответ написан
@Stormx480
Python Backend Developer
Вот тут есть хорошая статья по мульти-поточности в Python.

Дополню своим примером, только что протестировал.

spoiler
import multiprocessing
import os

def worker():
    #worker function
    print ('Worker')
    x = 0
    while x < 1000:
        print(x)
        x += 1
    return

if __name__ == '__main__':
    jobs = []
    for i in range(int(os.environ["NUMBER_OF_PROCESSORS"])):
        p = multiprocessing.Process(target=worker)
        jobs.append(p)
        p.start()


С помощью модуля os узнаем кол-во процессов, и говорим программе работать с их кол-вом.
Ответ написан
@deliro
Агрессивное программирование
Не надо трогать мультипроцессинг без острой необходимости. Используй ProcessPoolExecutor и asyncio (loop.run_in_executor)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы