[英]The python shelve.open(…,flag='n') does not create an empty shelve
[英]Resource temporarily unavailable on Python shelve.open
我有一个执行以下操作的 Python 应用程序:
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
我的猜测是发生这种情况是因为在某个时刻我打开了搁置文件以进行读写操作,这在定义上是有问题的。
有什么方法可以在不干扰读取操作的情况下更新搁置文件?
这更多是一个观念问题。 如果一个进程修改文件中的数据而另一个进程同时读取它,结果是一种不可预测的。
想象一下,您读取了文件的一部分,此时仅写入了某个值的一半。 读取只会无法正确解析条目,也可能无法正确解析所有后续条目。 换句话说,它迟早会破裂。
我认为最好的方法是将“搁置”集中在一个进程中或使用数据库。
我刚刚在一个小模块中使用搁置来缓存汇率时遇到了这个问题。 您可以使用 python 线程和全局threading.Lock()
对象来解决这个问题。
from threading import Lock
import shelve
mutex = Lock()
mutex.acquire()
db = shelve.open(db_name)
# write to db
db.close()
mutex.release()
可以在@ http://georg.io/2014/06/Python-Shelve-Thread-Safety找到代码片段的原始来源和该想法的功劳
```threading.Lock()`` 对象通过阻塞其他 python 线程来工作,直到它被释放。 见https://docs.python.org/2/library/threading.html#lock-objects
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.