Python子类化多处理.锁定



我试图理解为什么python不能编译以下类。

class SharedResource(multiprocessing.Lock):
def __init__(self, blocking=True, timeout=-1):
# super().__init__(blocking=True, timeout=-1)
self.blocking = blocking
self.timeout = timeout
self.data = {}

TypeError:方法需要2个参数,得到3个

我将Lock子类化的原因我的目标是创建一个共享的资源列表,该列表一次只能由进程使用。

这个概念最终将出现在Flash应用程序中,其中请求不应该同时使用资源

RuntimeError:锁定对象只能通过继承在进程之间共享

class SharedResource():
def __init__(self, id, model):
'''
id: mode id
model: Keras Model only one worker at a time can call predict
'''  
self.mutex = Lock()
self.id = id
self.model = model
manager = Manager()
shared_list = manager.list() # a List of models
shared_list.append(SharedResource())
def worker1(l):
...read some data
while True:
resource = l[0]
with m:
resource['model'].predict(...some data)
time.sleep(60)  

if __name__ == "__main__":
processes = [ Process(target=worker1, args=[shared_list])]
for p in processes:
p.start()
for p in processes:
p.join()

出现此错误的原因是multiprocessing.Lock实际上是一个函数。

.../multiprocessing/context.py中有以下行:

def Lock(self):
'''Returns a non-recursive lock object'''
from .synchronize import Lock
return Lock(ctx=self.get_context())

这可能会在未来发生变化,因此您可以在您的python版本上通过以下操作进行验证:

import multiprocessing
print(type(multiprocessing.Lock))

要真正将Lock子类化,您需要执行以下操作:

from multiprocessing import synchronize
from multiprocessing.synchronize import Lock
# Since Lock is now a class, this should work:
class SharedResource(Lock):
pass

我并不赞同这种做法,认为这是一种";"好";解决方案,但如果您真的需要子类化Lock,它应该可以解决您的问题。对试图避免被子类化的事物进行子类化通常不是一个好主意,但有时这可能是必要的。如果你能用不同的方式解决问题,你可能会考虑一下。

最新更新