使用`with:`语句的Python文件锁模块行为

使用`with:`语句的Python文件锁模块行为,python,multithreading,with-statement,file-locking,filelock,Python,Multithreading,With Statement,File Locking,Filelock,我只是想知道python模块filelock的细节以及它在一些情况下的行为 首先,线程处理with:语句的准确程度如何。如果多个线程通过以下方式调用:,它是否会逐个线程锁定?两个线程是否也可能同时获取锁 其次,当我将与一起使用时:使用后是否必须清除锁?执行with:语句后,锁是否自动清除 第三,我的代码中有一个实例,我认为必须创建一个文件,然后立即锁定。目前我使用的是: channel_file = open(os.path.join('channels', username), 'w+') w

我只是想知道python模块filelock的细节以及它在一些情况下的行为

首先,线程处理
with:
语句的准确程度如何。如果多个线程通过以下方式调用
,它是否会逐个线程锁定?两个线程是否也可能同时获取锁

其次,当我将
与一起使用时:
使用后是否必须清除锁?执行
with:
语句后,锁是否自动清除

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

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)}))
如果有一种可能性,另一个线程可以读取该文件,因为它被创建的时候,这将防止这种情况

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

  • FileLock维护一个锁计数器,该计数器在进程中的所有线程之间共享,并在线程锁后面受到保护。每次调用
    acquire()
    都会增加锁计数器,并且在计数器为零时还会获得操作系统级文件锁。类似地,每次调用
    release()
    都会减少锁计数器,并在计数器达到零时解锁文件

    因此,如果两个线程同时获得锁,则该进程将在操作系统级别锁定文件一次,并且锁计数器将增加2两个线程不会相互阻塞。

  • with:
    的要点是在其作用域退出后自动获取并释放锁。看

  • 文件锁用于防止在当前进程之外访问文件。它不用于线程方式锁定。使用常规螺钉进行螺纹锁紧

    # in __main__ or somewhere before we start the threads.
    channel_lock = threading.Lock()
    
    # in the worker thread
    with channel_lock:
        with open(...) as channel_file:
            channel_file.write(...)
    
  • 有关实现的详细信息,请参阅