首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用‘`with:’语句的Python filelock模块行为

使用‘`with:’语句的Python filelock模块行为
EN

Stack Overflow用户
提问于 2017-01-30 04:31:33
回答 1查看 3.1K关注 0票数 0

我只是想知道python的模块filelock的具体细节及其在一些情况下的行为。

首先,线程如何处理with:语句。如果多个线程调用with:,它是否被一个线程地锁定?两个线程也有可能同时获得锁吗?

第二,当我使用with:时,必须在使用它之后清除锁吗?在完成with:语句之后,锁会自动清除吗?

第三,我的代码中有一个实例,其中我认为必须创建一个文件,然后立即锁定。目前我使用的是:

代码语言:javascript
复制
channel_file = open(os.path.join('channels', username), 'w+')
with filelock.FileLock(os.path.join('channels', username)):
  channel_file.write(json.dumps({'rate': reobj.group(1),'time': reobj.group(2)}))

如果有可能在文件创建后,另一个线程就可以读取该文件,这会防止这种情况发生吗?

这也提出了第四点。使用with:时,filelock锁是否读取访问

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-30 06:15:27

  1. FileLock维护一个锁计数器,该计数器在进程中的所有线程之间共享,并且在线程级锁后面受到保护。每次对acquire()的调用都会增加锁计数器,并且在计数器为零时将获得OS级别的文件锁。类似地,每次对release()的调用都将减少锁定计数器,并在计数器达到零时解锁文件。 因此,如果两个线程同时获得锁,则该进程将在OS级别上锁定文件一次,锁计数器将增加2。两个线程将不会彼此阻塞.
  2. with:的目的是在其作用域退出后自动获取和释放锁。见What is the python "with" statement designed for?
  3. 文件锁用于保护当前进程之外的文件访问。它不用于线程方向锁定。在启动线程之前,使用常规的threading.Lock对线程进行locking.in __main__或在某个地方。channel_lock = threading.Lock() #在工作线程中使用channel_lock: with (.)as channel_file: channel_file.write(.)

有关实现细节,您可以参考py-filelock

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41929054

复制
相关文章

相似问题

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