Портативный способ использования локального общего хранилища для чтения / записи (файл / база данных) в качестве кэша для нескольких сценариев / процессов Python - PullRequest
0 голосов
/ 09 ноября 2019

Я ищу модуль или библиотеку, чтобы можно было читать и записывать значения так, как это делает простой словарь Python с простыми значениями (числа / строки / списки / поддиректории).

Безбезумный набор методов или классов без четкого примера, как здесь: https://dogpilecache.sqlalchemy.org/en/latest/core_usage.html#example-using-dogpile-directly-for-caching

В настоящее время я обнаружил, что fcache было бы довольно просто: https://fcache.readthedocs.io/en/stable/

Но начальныйтесты с множественным доступом к сценариям показывают исключения при доступе:

test1.py

from fcache.cache import FileCache

mycache = FileCache('1')

while True:
  mycache['test'] = '111'
  mycache.sync()
  x = mycache['test']
  if x != '111' and x != '222':
    print('=', x)

test2.py

from fcache.cache import FileCache

mycache = FileCache('1')

while True:
  mycache['test'] = '222'
  mycache.sync()
  x = mycache['test']
  if x != '111' and x != '222':
    print('=', x)

test1.py вывод:

Error opening file: C:\Users\User\AppData\Local\1\1\Cache\cache\74657374
= None

test2.py вывод:

Traceback (most recent call last):
  File "test2.py", line 7, in <module>
    mycache.sync()
  File "C:\Python\x86\38\lib\site-packages\fcache\cache.py", line 183, in sync
    self._write_to_file(filename, self._buffer[ekey])
  File "C:\Python\x86\38\lib\site-packages\fcache\cache.py", line 250, in _write_to_file
    os.chmod(filename, self._mode)
OSError: [WinError 6800] The function attempted to use a name that is reserved for use by another transaction: 'C:\\Users\\User\\AppData\\Local\\1\\1\\Cache\\cache\\7465737
4'

multiprocessing.Lock не может помочьисправьте это, поскольку те же ошибки зависят от чего-то другого, кроме эксклюзивного доступа.

Кажется, fcache несовместим с многопроцессорным доступом.

Я хочу сохранить набор значенийкак в общей таблице, где флаг указывает на актуальность строки. И если флаг установлен или нет, то из таблицы необходимо удалить строку.

У меня нет безумного количества процессов, у меня нет безумного количества объектов Python различной природыхранить. Только простые значения, может быть, сотни, не более.

Существует ли уже существующий, простой, надежный и разумный способ доступа к одному простому файлу или файлам без огромной кучи строк кода для нескольких сценариев / процессов?

1 Ответ

0 голосов
/ 09 ноября 2019

Я знаю, может быть, это решение придурковатое, но, по крайней мере, оно простое и проходит тест на Windows:

test1.py (протестировано в python 3.8 на Windows и LinuxMint)

from fcache.cache import FileCache
import time

mycache = FileCache('1')

i = 0
count = 0
y = '111'

while True:
  try:
    mycache['test'] = y
    mycache.sync()
    x = mycache['test']
    if x is None:
      print('FAILED', count, x)
    else:
      print('SUCCEED', count, x)
      i = 0
  except:
    # retry, has meaning on Windows
    i += 1
    if i % 10 == 0:
      # give to scheduler a break
      time.sleep(.02)
    continue
  count += 1

  if count % 10 == 0:
    # give to scheduler a break
    time.sleep(.02)

test2.py

<<<The same code as above>>>

И на моем компьютере отработано около 10 сценариев параллельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...