为什么我的python多进程程序仅在一个内核中运行?

时间:2019-06-23 15:35:59

标签: python python-multiprocessing

我正在尝试使多进程类对象在我的python程序的所有cpu内核中运行。该代码可以工作,但只能在一个内核中运行。

我想知道子进程是否按顺序运行,但是我找不到一种简单的方法来测试或避免它。

我的代码看起来像这样

#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()

我正在使用Windows 10在4核环境中运行python 3.8 64位

版本字符串:

在Win32上使用Python 3.8.0a1(tags / v3.8.0a1:e75eeb00b5,2019年2月3日,19:46:54)[MSC v.1916 32位(Intel)]

1 个答案:

答案 0 :(得分:4)

因为您在启动后立即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()会在需要时自行“休眠”,甚至更好:无需使用任何CPU。