1

我在一个列表中有一个 multiprocessing.Process 对象的集合,它们都使用我将称为“进程安全队列”的相同实例以进程安全(线程安全但与进程)的方式进行通信负责管理线程的父进程。

当子进程去往队列中放入东西时,它调用 ProcessSafeQueue().enqueue(),它首先获取一个 multiprocessing.Manager > RLock,然后写入队列,最后释放锁。

在这种情况下,它是子进程的 pid。这是错误的回溯。

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 小时后我可能会收到此错误。

4

2 回答 2

1

我有一个类似的问题,我通过删除socket.setdefaulttimeout解决了它。

于 2013-07-04T08:10:13.373 回答
0

这里的答案是该错误完全具有误导性。 Resource temporarily unavailable确实意味着在读取套接字时发生了一些错误。这可能是身份验证错误,或者根本没有可读取的数据(尽管我不确定为什么会产生错误……实际上确实如此)。这里的解决方案是抑制错误并重试。

[在 Python 中进一步体验并发的几年后更新]

我发现设计我的并发模型以减少/删除对同步机制(锁、队列或信号量)的需求,既简化了我的设计,又使其工作更加脆弱,并且没有我上面描述的错误。

于 2011-07-28T05:51:49.300 回答