Ресурс временно недоступен на Python shelve.open - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть приложение Python, которое выполняет следующие действия:

  • Вызывается другим процессом / процессами каждые 2-3 минуты, чтобы сохранить объект с помощью with shelve.open(shelvefilename, flag='c').
  • Вызывается другим процессом / процессами много раз в минуту, чтобы прочитать этот полочный файл, используя with shelve.open(shelvefilename, flag='r')

Проблема в том, что через некоторое время я получаю _gdbm.error: [Errno 11] Resource temporarily unavailable Ошибка:

   File "/path/to/myprog.py", line 755, in mymethod
    with shelve.open(shelvefilename, flag='r') as shlvfile:
  File "/usr/local/lib/python3.6/shelve.py", line 243, in open
    return DbfilenameShelf(filename, flag, protocol, writeback)
  File "/usr/local/lib/python3.6/shelve.py", line 227, in __init__
    Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback)
  File "/usr/local/lib/python3.6/dbm/__init__.py", line 94, in open
    return mod.open(file, flag, mode)
_gdbm.error: [Errno 11] Resource temporarily unavailable

Я предполагаю, что это произошло потому, что в какой-то момент я открыл файл shelve как для чтения, так и для записи, что является проблемным по определению.

Можно ли как-нибудь обновить файл полки, не нарушая операции чтения?

1 Ответ

0 голосов
/ 22 октября 2018

Это больше концептуальная проблема. Если один процесс изменяет данные в файле, в то время как другой процесс читает их одновременно, результат является непредсказуемым.

Представьте, что вы читаете часть файла, где только половина некоторого значения была записана в данный момент времени. При чтении просто не удастся правильно проанализировать запись и, вероятно, все последующие записи. Другими словами, он рано или поздно сломается.

Я думаю, что лучший подход - это централизовать "полку" в одном процессе или использовать базу данных.

...