【问题标题】:Synchronizing Inter-process access for Updating a common file同步进程间访问以更新公共文件
【发布时间】:2017-07-27 12:51:28
【问题描述】:

我有两个脚本正在更新同一个文件。两者可以同时运行。如何防止文件更新不一致?也就是说,如何序列化对文件的访问?

让我解释一下这个问题。假设有一个架子文件,并且有 2 个脚本正在更新它。脚本 1 执行此操作:

import shelve
sf = shelve.open('some_file')
sf[key1] = data1
sf.close()

脚本 2 的代码如下:

import shelve
sf = shelve.open('some_file')
sf[key2] = data2
sf.close()

假设脚本 2 在脚本 1 打开文件之后调度。当脚本 2 完成并且控制权返回到脚本 1 时,脚本 1 将进行更新并关闭文件。这将导致脚本 2 的更新丢失。如何防止这种情况发生,以便对文件进行两次更新?

【问题讨论】:

    标签: python concurrency python-3.6


    【解决方案1】:

    您可以使用粗锁来确保在任何给定时间只允许单个客户端访问文件。

    由于您处于不同的进程中,因此您需要某种可以从所有协作者那里读取的共享资源。

    Redis 提供了几个原语使这更容易(锁上的 TTL),并且由于它是单线程的,因此有助于推断并发访问:

    https://redis.io/topics/distlock

    【讨论】:

    • 可以使用标准库来完成吗?我可以在multiprocessing 模块中使用锁定功能吗?
    • redlock 没有明确锁定文件。它在代表资源(文件)的字符串上创建一个锁。但它确实有效。
    猜你喜欢
    • 1970-01-01
    • 2015-07-04
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多