具有多处理的对象池在Python中返回相同的对象

时间:2015-12-03 19:09:44

标签: python multiprocessing pool

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

我的结果是:

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

我希望看到类似的内容:

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

OR:

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

import multiprocessing

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()

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

如果您将进程ID添加到打印的消息中,那么这应该是显而易见的,例如:

import os

[...]

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

如果没有关于资源的更多背景信息,很难为您的问题提出解决方案。一种选择是在进程中创建共享Queue,让您的进程从中获取共享资源,并且可以在它们空闲后将其添加到那里。

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

检查documentation以获取更多选项。