мультипроцессорная обработка> Manager ()> Ошибка RLock: - PullRequest
1 голос
/ 11 июля 2011

У меня есть коллекция объектов 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] Ресурс временно недоступен

IМне интересно, может ли кто-нибудь помочь мне понять, почему я могу получить эту ошибку после успешного выполнения приложения в течение ~ 7 часов или около того.

Ответы [ 2 ]

1 голос
/ 04 июля 2013

У меня была похожая проблема, и я решил ее, удалив socket.setdefaulttimeout .

0 голосов
/ 28 июля 2011

Ответ здесь заключается в том, что ошибка полностью вводит в заблуждение. Resource temporarily unavailable действительно означает, что произошла ошибка при чтении сокета. Это может быть ошибка аутентификации, или просто не было доступных данных для чтения (хотя я не уверен, почему это вызовет ошибку ... это происходит на практике). Решение здесь состоит в том, чтобы подавить ошибку и повторить попытку.

[Обновление после нескольких лет дальнейшего опыта работы с параллелизмом в Python]

Я обнаружил, что проектирование моей модели параллелизма для уменьшения / удаления в целом потребности в механизмах синхронизации (блокировки, очереди или семафоры) одновременно упростило мой дизайн и позволило ему работать с меньшей хрупкостью и без ошибок, которые я описал выше.

...