使用空隙方法/二传手方法进行多处理



我仍然是多处理的新手,但在过去的几天里做了很多阅读,想看看我的想法使用多处理是否可行。

许多在线多处理示例如下所示:

def worker():
print('Worker')
if __name__ == '__main__':
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker)
jobs.append(p)
p.start()

但是多处理的示例方法总是返回或打印一些东西!有没有办法做到以下几点?

import multiprocessing
class Worker():
def __init__(self):
self.level=0
def setLevel(self,val):
self.level=val
def method(worker, level):
worker.setLevel(level)
if __name__ == '__main__':
jobs = []
for i in range(5):
jobs.append(Worker())
pool=multiprocessing.Pool()
for i in range(5):
worker=jobs[i]
res = pool.apply_async(method, args=(worker,i,))
pool.close()
pool.join()
for worker in jobs:
print(worker.level)

我知道apply_async返回一个结果对象,你可以用Result.get()获得其值,但这在我描述的设置中似乎没有用。

当我执行以下代码时,我得到的是0 0 0 0 0而不是所需的0 1 2 3 4结果。

一般来说,不需要从传递给Pool.appy_async()的函数中返回某些内容,但在这种情况下,为了更新jobs列表中仅存在于主进程中的相应Worker对象,这是必要的。

这是因为当multiprocessing时,每个进程都在自己的内存空间中运行,这意味着您无法在它们之间共享全局变量。有一些方法可以模拟它,但它通常需要大量的开销,并且实际上可能会破坏执行多处理的任何收益。每个子进程都会传递Worker对象的副本

考虑到这一点,这里有一种方法可以使你的代码工作。method()函数现在将更新的Worker对象返回(副本)给主进程,主进程将与每个结果对象关联的所有结果对象存储在名为results的单独列表中。在pool.join()调用之后处理完所有作业后,该列表将用于替换最初放入jobs列表中的每个Worker对象 - 仅使其看起来好像它们已自行更新。

import multiprocessing

class Worker():
def __init__(self):
self.level = 0
def setLevel(self,val):
self.level = val

def method(worker, level):
worker.setLevel(level)
return worker  # ADDED - return updated Worker object.

if __name__ == '__main__':
jobs = []
for i in range(5):
jobs.append(Worker())
results = []
pool = multiprocessing.Pool()
for i in range(5):
worker = jobs[i]
results.append(pool.apply_async(method, (worker, i)))
pool.close()
pool.join()
# Update Workers in jobs list.
for i, result in enumerate(results):
jobs[i] = result.get()  # Replace workers with their updated version.
for worker in jobs:
print(worker.level)

相关内容

  • 没有找到相关文章

最新更新