gpt4 book ai didi

python子类化multiprocessing.Process

转载 作者:IT老高 更新时间:2023-10-28 22:21:32 26 4
gpt4 key购买 nike

我是 python 面向对象的新手,我正在将我现有的应用程序重写为面向对象的版本,因为现在开发人员越来越多,我的代码变得不可维护。

通常我使用多处理队列,但我从这个例子中发现 http://www.doughellmann.com/PyMOTW/multiprocessing/basics.html我可以继承 multiprocessing.Process 所以我认为这是一个好主意,我写了一个类来测试这样的:

代码:

from multiprocessing import Process
class Processor(Process):
def return_name(self):
return "Process %s" % self.name
def run(self):
return self.return_name()

processes = []


if __name__ == "__main__":

for i in range(0,5):
p=Processor()
processes.append(p)
p.start()
for p in processes:
p.join()

但是我无法取回这些值,我该如何以这种方式使用队列?

编辑:我想获取返回值并考虑将 Queues() 放在哪里。

最佳答案

子类 multiprocessing.Process :

However I cannot get back the values, how can I use queues in this way?

进程需要 Queue()接收结果... 如何子类 multiprocessing.Process 的示例接下来...

from multiprocessing import Process, Queue
class Processor(Process):

def __init__(self, queue, idx, **kwargs):
super(Processor, self).__init__()
self.queue = queue
self.idx = idx
self.kwargs = kwargs

def run(self):
"""Build some CPU-intensive tasks to run via multiprocessing here."""
hash(self.kwargs) # Shameless usage of CPU for no gain...

## Return some information back through multiprocessing.Queue
## NOTE: self.name is an attribute of multiprocessing.Process
self.queue.put("Process idx={0} is called '{1}'".format(self.idx, self.name))

if __name__ == "__main__":
NUMBER_OF_PROCESSES = 5

## Create a list to hold running Processor object instances...
processes = list()

q = Queue() # Build a single queue to send to all process objects...
for i in range(0, NUMBER_OF_PROCESSES):
p=Processor(queue=q, idx=i)
p.start()
processes.append(p)

# Incorporating ideas from this answer, below...
# https://stackoverflow.com/a/42137966/667301
[proc.join() for proc in processes]
while not q.empty():
print "RESULT: {0}".format(q.get()) # get results from the queue...

在我的机器上,这会导致...

$ python test.py
RESULT: Process idx=0 is called 'Processor-1'
RESULT: Process idx=4 is called 'Processor-5'
RESULT: Process idx=3 is called 'Processor-4'
RESULT: Process idx=1 is called 'Processor-2'
RESULT: Process idx=2 is called 'Processor-3'
$


使用 multiprocessing.Pool :

FWIW,我发现子类化的一个缺点 multiprocessing.Process是您无法利用 multiprocessing.Pool 的所有内置优点; Pool如果您需要您的生产者和消费者代码通过队列相互交谈,则为您提供了一个非常好的 API。

你可以用一些创造性的返回值做很多事情......在下面的例子中,我使用了 dict()封装来自 pool_job() 的输入和输出值...

from multiprocessing import Pool

def pool_job(input_val=0):
# FYI, multiprocessing.Pool can't guarantee that it keeps inputs ordered correctly
# dict format is {input: output}...
return {'pool_job(input_val={0})'.format(input_val): int(input_val)*12}

pool = Pool(5) # Use 5 multiprocessing processes to handle jobs...
results = pool.map(pool_job, xrange(0, 12)) # map xrange(0, 12) into pool_job()
print results

这会导致:

[
{'pool_job(input_val=0)': 0},
{'pool_job(input_val=1)': 12},
{'pool_job(input_val=2)': 24},
{'pool_job(input_val=3)': 36},
{'pool_job(input_val=4)': 48},
{'pool_job(input_val=5)': 60},
{'pool_job(input_val=6)': 72},
{'pool_job(input_val=7)': 84},
{'pool_job(input_val=8)': 96},
{'pool_job(input_val=9)': 108},
{'pool_job(input_val=10)': 120},
{'pool_job(input_val=11)': 132}
]

显然,pool_job() 中还有许多其他改进需要改进。 ,例如错误处理,但这说明了要点。仅供引用,this answer提供了如何使用 multiprocessing.Pool 的另一个示例.

关于python子类化multiprocessing.Process,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8489684/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com