我有对象池来管理一些资源。 我希望使用不同的进程创建重用资源。 但我发现所有资源都具有相同的ID并被创建为新对象。
我的结果是:
我希望看到类似的内容:
OR:
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()
答案 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以获取更多选项。