我正在尝试使多进程类对象在我的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)]
答案 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。