繁体   English   中英

Python shelve.open 上的资源暂时不可用

[英]Resource temporarily unavailable on Python shelve.open

我有一个执行以下操作的 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

我的猜测是发生这种情况是因为在某个时刻我打开了搁置文件以进行读写操作,这在定义上是有问题的。

有什么方法可以在不干扰读取操作的情况下更新搁置文件?

这更多是一个观念问题。 如果一个进程修改文件中的数据而另一个进程同时读取它,结果是一种不可预测的。

想象一下,您读取了文件的一部分,此时仅写入了某个值的一半。 读取只会无法正确解析条目,也可能无法正确解析所有后续条目。 换句话说,它迟早会破裂。

我认为最好的方法是将“搁置”集中在一个进程中或使用数据库。

我刚刚在一个小模块中使用搁置来缓存汇率时遇到了这个问题。 您可以使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM