You might try klepto
, which provides a dictionary interface to a sql database (using sqlalchemy
under the covers). If you choose to persist your data to a mysql
, postgresql
, or other available database (aside from sqlite
), then you can have two or more people access the data simultaneously or have two threads/processes access the database tables -- and have the database manage the concurrent read-writes. Using klepto
with a database backend will perform under concurrent access as well as if you were accessing the database directly. If you don't want to use a database backend, klepto
can write to disk as well -- however there is some potential for conflict when writing to disk -- even though klepto
uses a "copy-on-write, then replace" strategy that minimizes concurrency conflicts when working with files on disk. When working with a file (or directory) backend, your issues 1-2-3 are still handled due to the strategy klepto
employs for saving writes to disk. Additionally, klepto
can use a in-memory caching layer that enables fast access, where loads/dumps from the on-disk (or database) backend are done either on-demand or when the in-memory cache reaches a user-determined size.
To be specific: (1) both are served at the same time. (2) if one user makes an edit, the other user sees the change -- however that change may be 'delayed' if the second user is using an in-memory caching layer. (3) multiple simultaneous writes are not a problem, due to klepto
letting NFS or the sql database handle the "copy-on-write, then replace" changes.
The dictionary interface for klepto.archvives
is also available in a decorator form that provided LRU
caching (and LFU
and others), so if you have a function that is generating/accessing the data, hooking up the archive is really easy -- you get memorization with an on-disk or database backend.
With klepto
, you can pick from several different serialization methods to encrypt your data. You can have klepto
cast data to a string, or use a hashing algorithm (like md5
), or use a pickler (like json
, pickle
, or dill
).
You can get klepto
here: https://github.com/uqfoundation/klepto