【问题标题】:Python subclassing multiprocessing.LockPython 子类化 multiprocessing.Lock
【发布时间】:2020-09-17 20:21:56
【问题描述】:

我正在尝试理解为什么 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 子类化的原因 我的目标是创建一个共享资源列表,一次只能由 on 进程使用。

这个概念最终会出现在请求不能同时使用资源的 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()

【问题讨论】:

  • 是给类定义错误还是在您尝试创建对象时出错?你能显示创建此类实例的调用吗?
  • __init__ 没有任何记录在案的公共参数(有一个ctx)——你正在考虑acquire 方法——尽管你可能最好有一个@ 987654327@ 成员而不是子类化
  • @AnthonySottile 这是我的第一次尝试,我添加了更多细节来说明为什么在我的情况下这不起作用
  • 继承不是指子类化——你不想继承 Lock。这意味着子进程可以从父进程继承锁。在stackoverflow.com/questions/25557686/… 中讨论

标签: python python-multiprocessing


【解决方案1】:

您收到此错误的原因是因为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,它应该可以解决你的问题。子类化试图避免被子类化的东西通常不是一个好主意,但有时它可能是必要的。如果您能以不同的方式解决问题,您可能需要考虑这一点。

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2012-04-23
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多