首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fcntl文件锁示例不工作

fcntl文件锁示例不工作
EN

Stack Overflow用户
提问于 2016-01-04 16:01:18
回答 1查看 1.1K关注 0票数 0

我正在尝试在python 3.4.3中编写一个锁定文件的玩具示例,但是我没有得到预期的结果。

我有两个脚本,script1.py和script2.py:

代码语言:javascript
复制
#script1.py
import pickle
import pandas as pd
import numpy as np
import time
import fcntl

df = pd.DataFrame.from_dict({"script_id": [0], "val1": [0], "val2": [0]})
df.to_pickle("data.pkl")

for i in range(500):
    f = open("data.pkl", "rb+")
    while True:
        try:
            # lock if unlocked
            fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
            break
        except:
            time.sleep(0.01)
    df.loc[i, :] = np.concatenate([np.array([1]), np.random.sample(2)])
    time.sleep(np.random.uniform(0, 0.05))
    pickle.dump(df, f)
    # unlock when done
    fcntl.flock(f, fcntl.LOCK_UN)
    f.close()

第二个脚本非常相似:

代码语言:javascript
复制
import pickle
import pandas as pd
import numpy as np
import time
import fcntl

f = open("data.pkl", "rb")
while True:
    try:
        fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
        df = pickle.load(f)
        fcntl.flock(f, fcntl.LOCK_UN)
        f.close()
        break
    except:
        time.sleep(0.001)

for i in range(500, 1000):
    f = open("data.pkl", "rb+")
    while True:
        try:
            # lock if unlocked
            fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
            break
        except:
            time.sleep(0.01)
    df.loc[i, :] = np.concatenate([np.array([2]), np.random.sample(2)])
    time.sleep(np.random.uniform(0, 0.05))
    pickle.dump(df, f)
    # unlock when done
    fcntl.flock(f, fcntl.LOCK_UN)
    f.close()

这样做的想法是,两个脚本应该读取和写入同一个文件,并有一些人为的延迟。

每个脚本都向从data.pkl加载的数据文件中添加一个随机行,它应该加到1000行。

我首先运行script1,然后尽可能快地运行script2。我以500 + n行数据为结束,其中n是运行script2之前附加的行数。

为什么我在一个玩具例子中使用熊猫和矮胖?我将有一个类似的用例,所以我想确保它与我将要使用的对象一起工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-05 09:42:41

这是解决办法,以防其他人遇到这个问题。

我创建了第二个文件lock.lck,它在执行操作和写入data.pkl文件时被锁定。写入data.pkl之后,锁就会被释放。

代码语言:javascript
复制
# script1.py
import pandas as pd
import numpy as np
import time
import fcntl

df = pd.DataFrame.from_dict({"script_id": [0], "val1": [0], "val2": [0]})
df.to_pickle("data.pkl")

for i in range(500):
    with open("lock.lck", "r") as f_lock:
        fcntl.flock(f_lock, fcntl.LOCK_EX)
        time.sleep(np.random.uniform(0, 0.05))

        df = pd.read_pickle("data.pkl")
        df.loc[i, :] = np.concatenate([np.array([1]), np.random.sample(2)])
        df.to_pickle("data.pkl")

现在是第二个脚本:

代码语言:javascript
复制
# script2.py
import pandas as pd
import numpy as np
import time
import fcntl

for i in range(500,1000):
    with open("lock.lck") as f_lock:
        fcntl.flock(f_lock, fcntl.LOCK_EX)
        time.sleep(np.random.uniform(0, 0.05))

        df = pd.read_pickle("data.pkl")
        df.loc[i, :] = np.concatenate([np.array([2]), np.random.sample(2)])
        df.to_pickle("data.pkl")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34595041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档