多处理.进程不并行运行进程



>我尝试运行一个非常简单的多处理代码,但代码仍然是串行处理的。

我尝试使用python 2和3在Mac(macOS 10.13(和Linux(Ubuntu 18.04(上运行它,但是在这两种环境中我都遇到了相同的问题。

函数 _process 必须接收numpy数组作为参数,所以我决定使用Multiprocess.Process而不是Multiprocess.Pool.map()Multiprocess.Pool.apply_async((,因为在类中使用pool.map()时 pickle 会损坏。 https://stackoverflow.com/a/21345308/4755986

import time
from multiprocessing import Process, Queue
import numpy as np
class model:
def __init__(self):
self.results = []
self.jobs = []
self.start = time.time()
def _process(self, x,y,z):
j= 0
for i in range(10**8):
j = i+j
return j
def work(self,X,Y,Z, result_queue):
start = time.time() -self.start
result = self._process(X,Y,Z)
result_queue.put(result)
print(result)
end = time.time()   -self.start
print( 'start time: ', start)
print('end time:', end)
#        return result_queue
def fit(self,num):
for i in range(num):
X, Y, Z =  np.ones([5,5]), np.ones([3,3]), np.ones([2,2])
result_queue = Queue()
p = Process(target=self.work, args = (X,Y,Z, result_queue))
self.jobs.append(p)
p.start()
print( 'ChildProcess...',i)
result = result_queue.get()
self.results.append(result)
for p in self.jobs:
p.join()
p.close()
return self.results

R = model()
k = R.fit(10)
print(k)

打印每个进程的开始和结束时间,第二个进程仅在第一个进程完成后开始。这很奇怪,因为每个进程都应该自动分配给不同的内核并并行运行。

result = result_queue.get()

如果为空,result_queue.get()将阻止。仅当进程完成时才会添加项目,因此仅当前一个进程完成后才会生成下一个进程。

下面是一个一次生成 10 个进程的版本。我已经标记了我添加的部分:

import time
from multiprocessing import Process, Queue
import numpy as np
class model:
def __init__(self):
self.results = []
self.jobs = []
self.start = time.time()
def _process(self, x,y,z):
j= 0
for i in range(10**8):
j = i+j
return j
def work(self,X,Y,Z, result_queue):
start = time.time() -self.start
result = self._process(X,Y,Z)
result_queue.put(result)
print(result)
end = time.time()   -self.start
print( 'start time: ', start)
print('end time:', end)
#        return result_queue
def fit(self,num):
for i in range(num):
X, Y, Z =  np.ones([5,5]), np.ones([3,3]), np.ones([2,2])
result_queue = Queue()
p = Process(target=self.work, args = (X,Y,Z, result_queue))
self.jobs.append(p)
p.start()
print( 'ChildProcess...',i)
#result = result_queue.get()   # <--- This blocks
#self.results.append(result)
for p in self.jobs:
p.join()
p.close()
for result in result_queue:        # <-----
self.results.append(result)    # <-----
return self.results

R = model()
k = R.fit(10)
print(k)

相关内容

  • 没有找到相关文章

最新更新