Python 使用Pickle和filelock在多线程中加载并转储到文件-IOError:[Errno 13]

Python 使用Pickle和filelock在多线程中加载并转储到文件-IOError:[Errno 13],python,multithreading,pickle,filelock,Python,Multithreading,Pickle,Filelock,我有一个服务,它使用python 2.7将数据从pythondict加载并转储到文件中。许多用户可以同时调用此服务 什么方法允许cPickle在多线程上下文中读取数据并将其转储到单个文件中,以避免操作期间数据的去同步(在另一个进程转储时加载)问题 我曾想用它,但还没有成功 在下面的代码中,文件始终为havecPickle.load(cache\u file)IOError:[Errno 13]权限被拒绝“init\u cache()或update\u cache()中的错误 根据Filelock

我有一个服务,它使用python 2.7将数据从python
dict
加载并转储到文件中。许多用户可以同时调用此服务

什么方法允许
cPickle
在多线程上下文中读取数据并将其转储到单个文件中,以避免操作期间数据的去同步(在另一个进程转储时加载)问题

我曾想用它,但还没有成功

在下面的代码中,文件始终为have
cPickle.load(cache\u file)IOError:[Errno 13]权限被拒绝“
init\u cache()或
update\u cache()中的错误


根据Filelock文档,您应该在
中包装lock.acquire,在
中尝试{}除外{}
。否则,当您的acquire超时时,它可能会以未处理的异常使您的应用程序崩溃。请参阅根据Filelock文档,您应该在
中包装lock.acquire,在
中尝试{}除外{}
。否则,当acquire超时时,它可能会导致应用程序崩溃,出现未经处理的异常。请参阅

我已找到解决问题的方法

似乎您必须指定与正在打开的文件不同的锁名

lock=filelock.filelock(“{}.lock.format(self.cache\u file\u path))
而不是
lock=filelock.filelock(self.cache\u file\u path)

例如:

def update_cache(self, cache_dict, query_id):
    cache_dict["queries"][query_id] = base64.b64encode(zlib.compress(json.dumps(self.query_features())))
    lock = lock = filelock.FileLock("{}.lock".format(self.cache_file_path))
    try:
        with lock.acquire(timeout = 10):
            with open(self.cache_file_path, "wb") as cache_file:
                pickle.dump(cache_dict, cache_file)
                return cache_dict
    except lock.Timeout:
        self.add_service_error("update_cache timeout", traceback.format_exc())

我已经找到了解决我问题的办法

似乎您必须指定与正在打开的文件不同的锁名

lock=filelock.filelock(“{}.lock.format(self.cache\u file\u path))
而不是
lock=filelock.filelock(self.cache\u file\u path)

例如:

def update_cache(self, cache_dict, query_id):
    cache_dict["queries"][query_id] = base64.b64encode(zlib.compress(json.dumps(self.query_features())))
    lock = lock = filelock.FileLock("{}.lock".format(self.cache_file_path))
    try:
        with lock.acquire(timeout = 10):
            with open(self.cache_file_path, "wb") as cache_file:
                pickle.dump(cache_dict, cache_file)
                return cache_dict
    except lock.Timeout:
        self.add_service_error("update_cache timeout", traceback.format_exc())

谢谢你指出这一点,但我仍然有相同的错误!可能库中存在允许两个线程同时获取锁的错误?我不知道可能是什么问题。谢谢你指出这一点,但我仍然有相同的错误!可能库中存在允许两个线程同时获取锁的错误同一时间?我不知道会出什么问题。