【问题标题】:Object pool with multiprocessing returns the same object in Python具有多处理的对象池在 Python 中返回相同的对象
【发布时间】:2015-12-03 19:09:44
【问题描述】:

我有对象池来管理一些资源。 我希望使用通过不同进程创建的重用资源。 但我看到所有资源都具有相同的 ID 并被创建为新对象。


我的结果是:

  • 创建新资源 = 1
  • 创建新资源 = 2
  • 创建新资源 = 3
  • 创建新资源 = 1
  • 创建新资源 = 2
  • 创建新资源 = 3
  • 创建新资源 = 1
  • 创建新资源 = 2
  • 创建新资源 = 3

我预计会看到这样的内容:

  • 创建新资源 = 1
  • 创建新资源 = 2
  • 创建新资源 = 3
  • 使用现有资源 = 1
  • 使用现有资源 = 2
  • 使用现有资源 = 3
  • 使用现有资源 = 1
  • 使用现有资源 = 2
  • 使用现有资源 = 3

或者:

  • 创建新资源 = 1
  • 创建新资源 = 2
  • 创建新资源 = 3
  • 创建新资源 = 4
  • 创建新资源 = 5
  • 创建新资源 = 6
  • 创建新资源 = 7
  • 创建新资源 = 8
  • 创建新资源 = 9

导入多处理

class Resource(object): def __init__(self, ID): self.id = ID class ObjectPool: __id = 0 __instance = None __resources = list() def __init__(self): if ObjectPool.__instance != None: raise NotImplemented("This is a singleton class.") @staticmethod def getInstance(): if ObjectPool.__instance == None: ObjectPool.__instance = ObjectPool() return ObjectPool.__instance def getResource(self): if len(self.__resources) > 0: resourse = self.__resources.pop(0) print "Using existing resource = ", resourse.id return resourse else: ObjectPool.__id += 1 print "Creating new resource = ", ObjectPool.__id return Resource(ID=ObjectPool.__id) def returnResource(self, resource): self.__resources.append(resource) POOL = ObjectPool.getInstance() def func(): resource = POOL.getResource() resource2 = POOL.getResource() resource3 = POOL.getResource() POOL.returnResource(resource) POOL.returnResource(resource2) POOL.returnResource(resource3) if __name__ == "__main__": for n in range(3): process = multiprocessing.Process(target=func) process.start()

【问题讨论】:

    标签: python multiprocessing pool


    【解决方案1】:

    您从未更改过ObjectPool.id 的值,因此它始终为零。

    【讨论】:

    • 我在创建新资源时更改了它 ObjectPool.id+1
    • @Helga:这不会改变它。这只比它多返回一个。如果你先做x = 1 然后y = x+1,这不会改变x
    • 好的,谢谢,我明白了!!!我已经解决了这个问题。这确实是我的错误,但一般问题仍然存在。我已经更新了它。问题是我有相同 ID 的新资源。
    【解决方案2】:

    代码未按预期执行,因为使用 multiprocessing.Process 创建的每个新进程都在创建一个新的本地 POOL 实例。

    如果您将进程 ID 添加到打印的消息中,这应该会变得很明显,例如:

    import os
    
    [...]
    
    print "[%04d] Using existing resource = %s" % (os.getpid(), resourse.id)
    

    如果没有更多关于资源是什么的上下文,就很难为您的问题提出解决方案。一种选择是在 main 进程中创建一个共享的Queue 并让您的进程从它们那里获取共享资源,并且可能在它们空闲后将它们添加到那里。

    如果共享资源的数量固定,则可能使用Semaphore

    查看documentation 了解更多选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-13
      • 2022-12-03
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 1970-01-01
      相关资源
      最近更新 更多