multiprocessing > Manager() > RLock 错误:

1 投票
2 回答
2538 浏览
提问于 2025-04-16 21:14

我有一堆叫做 multiprocessing.Process 的对象,它们都放在一个列表里。这些对象使用同一个我称之为“进程安全队列”的东西来和父进程沟通,这样可以确保在多进程的情况下也能安全地交流,父进程负责管理这些线程。

当子进程想往队列里放东西时,它会调用 ProcessSafeQueue().enqueue()。这个过程首先会获取一个叫做 multiprocessing.Manager 的锁,然后写入队列,最后再释放这个锁。

在这个情况下,锁的内容是子进程的进程ID。下面是错误的追踪信息。

Traceback (most recent call last): 
File /usr/lib/python2.5/site-packages/my_project/some_module.py, line 87, in send_data
    q.enqueue(os.getpid())
File /usr/lib/python2.5/site-packages/my_project/some_module.py, line 33, in enqueue
    self.lock.acquire()
File /usr/lib/python2.5/site-packages/processing/managers.py, line 979, in acquire
    return self._callMethod(\'acquire\', (blocking,))
File /usr/lib/python2.5/site-packages/processing/managers.py, line 740, in _callMethod
    self._connect()
File /usr/lib/python2.5/site-packages/processing/managers.py, line 727, in _connect
    connection = Client(self._token.address, authkey=self._authkey)
File /usr/lib/python2.5/site-packages/processing/connection.py, line 187, in Client
    answerChallenge(c, authkey)
File /usr/lib/python2.5/site-packages/processing/connection.py, line 425, in answerChallenge
    message = connection.recvBytes()

这是实际的错误信息:

IOError: [Errno 11] 资源暂时不可用

我在想,为什么我的应用程序运行了大约7个小时后会出现这个错误,有没有人能帮我理解一下?

2 个回答

1

我之前也遇到过类似的问题,我是通过去掉 socket.setdefaulttimeout 这个设置来解决的。

0

这里的答案是,这个错误信息其实很误导。Resource temporarily unavailable 其实是说在读取网络连接时出现了一些问题。这可能是因为认证出错,或者根本没有数据可供读取(虽然我不太明白为什么会出现错误……但在实际操作中确实会)。解决这个问题的方法就是忽略这个错误,然后重试。

[经过几年的Python并发编程经验后的更新]

我发现,如果我设计的并发模型能够减少或完全消除对同步机制(比如锁、队列或信号量)的需求,这样不仅简化了我的设计,还让它在运行时更稳定,不会出现我之前提到的错误。

撰写回答