Мультипроцессорная обработка> 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.

Другие вопросы по тегам