Skip to main content
 首页 » 编程设计

python之多处理时保留类实例列表内容

2025年05月04日852php

假设我有一个名为 dog 的类:

class dog(): 
     def __init__(self, name, age): 
          self.name = name 
          self.age = age 
          self.fleas = [] 

现在假设我有一个名字列表,

names = ["bob", "joe", "dave"]  

然后我创建一个列表,执行以下操作:

dogs = [dog(name, index) for index, name in enumerate(names)]  # Creates a list "dogs" that has 3 dog classes in it, named bob, joe, david, with ages 0, 1, 2 respectively. 

现在我有一本跳蚤词典,

global_fleas = {"bob":[flea_43], "joe":[flea_20], "dave":[flea_3]} 

还有一些单独的方法 flea_mod() 可以修改这个字典,以便将每只狗的跳蚤编号更改为某个随机数,例如 flea_50。这本字典中的每只狗只会有一只跳蚤。

我可以通过执行以下操作将 global_fleas 中的跳蚤附加到其对应的狗:

def dirty_dog(dog): 
     dog.fleas.append(global_fleas[dog.name]) 

这是关键。我想多处理这个循环。这是我现在拥有的:

while True: 
    flea_mod()  # This randomizes the flea_number for each dog in the global_flea dictionary 
    pool = multiprocessing.Pool(processes=len(dogs)) 
    [pool.apply_async(dirty_dog, dog) for dog in dogs] 
    pool.close() 
    pool.join() 

所以问题是每次循环运行时每个狗对象都不会保留其跳蚤列表。我希望在每个循环结束时保留每只狗的跳蚤列表,因此在两次循环后,每只狗将有两只跳蚤,依此类推。有任何想法吗?我猜我得腌制一些东西。

请您参考如下方法:

多处理文档建议尽可能不要共享状态,但您可以使用托管字典来实现您的目标:

http://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes

(请参阅基于服务器的管理器部分。)

这样您就可以根据您的核心逻辑更改单个托管对象,并且处理节点会看到更新后的版本。您必须在您的代码中尝试一下,看看最好的共享设置是什么(如果有的话!)。