multiprocessing > Manager() > RLock 错误:
我有一堆叫做 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并发编程经验后的更新]
我发现,如果我设计的并发模型能够减少或完全消除对同步机制(比如锁、队列或信号量)的需求,这样不仅简化了我的设计,还让它在运行时更稳定,不会出现我之前提到的错误。