Мультипроцессорная обработка> Manager() > Ошибка RLock:
У меня есть коллекция объектов 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 часов или около того.
2 ответа
Ответ здесь заключается в том, что ошибка полностью вводит в заблуждение. Resource temporarily unavailable
действительно означает, что произошла ошибка при чтении сокета. Это может быть ошибка аутентификации или просто нет данных, доступных для чтения (хотя я не уверен, почему это вызовет ошибку... это происходит на практике). Решение здесь состоит в том, чтобы подавить ошибку и повторить попытку.
[Обновление после нескольких лет дальнейшего опыта работы с параллелизмом в Python]
Я обнаружил, что проектирование моей модели параллелизма для уменьшения / удаления в целом необходимости в механизмах синхронизации (блокировки, очереди или семафоры) одновременно упростило мой дизайн и позволило ему работать с меньшей хрупкостью и без ошибок, которые я описал выше.
У меня была похожая проблема, и я решил ее, удалив socket.setdefaulttimeout.