Python中的shelve是线程安全的吗?

12 投票
3 回答
4983 浏览
提问于 2025-04-16 12:58

Python中的shelve模块用于数据持久化(也就是把数据保存到硬盘上),那么这个模块在多线程环境下安全吗?如果不安全,有什么好的替代方案呢?

3 个回答

-1

在编程中,有时候我们会遇到一些问题,比如代码运行得不如预期。这种情况可能是因为我们没有正确理解某些概念或者使用了不合适的方法。

例如,有些人可能在使用某个函数时,没搞清楚它的参数应该是什么样的,或者它返回的结果是什么。这就像你在做菜时,如果没有按照食谱来,可能做出来的菜就不好吃。

所以,遇到问题时,首先要仔细检查自己的代码,看看有没有哪里写错了,或者有没有遗漏什么重要的步骤。同时,也可以参考一些资料或者请教其他人,帮助自己更好地理解。

总之,编程就像学习一门新技能,遇到困难是很正常的,关键是要保持耐心,慢慢摸索,最终你会越来越熟练的。

Threads = # amount of threads

thread_moment = [False for _ in range(Threads)] 

def job(x):  # x would be the index of the thread  

    lock.aquire()

    # open/edit/update/close your shelve file

    thread_moment[x] = True 

    lock.release()

    while True:
        if all(thread_moment) == True:
            thread_moment = [False for _ in range(threads)]
            break
        else:
            time.sleep(1)

    # carry on with your script
3

替代方案:ZODB

http://www.zodb.org/

14

根据标准库关于Shelve模块的文档,特别是“限制”这一部分

shelve模块不支持同时读写存储的对象。(多个同时读取是安全的。)

我认为这可能和具体的实现有关,因此为了确保,我可以得出结论,它肯定不是线程安全的。

撰写回答