Почему моя многопроцессорная программа на Python работает только в одном ядре? - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь заставить объекты классов с несколькими процессами работать во всех ядрах процессора в моей программе на python.Код работает, но он работает только в одном ядре.

Интересно, если дочерние процессы работают последовательно, но я не могу найти простой способ проверить это или избежать его.

Мой код выглядит примерно так

#child processes

import multiprocessing as mp
import time
import random
class child(mp.Process):
    def __init__(self,comm):
        mp.Process.__init__(self)
        self.comm = comm
    def run(self):
        self.score = self.doWork()
        self.comm.put([self.score])
    def doWork(self):
        k = 0
        for x in range(9999):
            for y in range(9999):
                k = k + 1
        return random.randint(1,1000)
#main process
def runSubProcess():
     list = []
     queue = mp.Queue()
     for p in range(4):
         p = child(queue)
         p.start()
         p.join()
         list.append(p)
     stillRunning = True
     while stillRunning:
         stillRunning = False
         for p in list:
             if p.is_alive():
                 stillRunning = True
         time.sleep(0.1)
     while not queue.empty():
         item = queue.get()
         print (item)

if __name__ == "__main__":
    runSubProcess()

Я использую Python 3.8 64 бит в 4-ядерном окружении с использованием Windows 10

Строка версии:

Python 3.8.0a1 (теги / v3.8.0a1: e75eeb00b5, 3 февраля 2019, 19:46:54) [MSC v.1916 32 бит (Intel)] на win32

1 Ответ

4 голосов
/ 23 июня 2019

Потому что вы сразу join() это после запуска.Это заставляет основную программу ждать, пока ребенок завершит работу.

Сначала запустите все из них, а затем объедините все в другом цикле, например:

def runSubProcess():
     list = []
     queue = mp.Queue()
     for p in range(4):
         p = child(queue)
         p.start()
         list.append(p)
     for p in list:
         p.join()
     while not queue.empty():
         item = queue.get()
         print (item)

Обратите внимание, что в этом нет необходимости.для сна, так как join() будет «спать» сам, при необходимости - даже лучше: без использования процессора.

...