2017-01-30 699 views
0

我只是想知道在几种情况下python的模块filelock及其行为的具体情况。Python的filelock模块行为使用`with:`语句

首先,线程处理with:语句的确切程度。如果多个线程调用with:它是否锁定在一个线程的基础上?两个线程可能同时获得锁吗?

其次,当我使用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)})) 

如果有可能另一个线程可以读,因为它创建时的文件,这会防止呢?

这也提出了第四点。文件锁定在使用with:时锁定读取访问吗?

回答

0
  1. 的的FileLock保持锁定计数器,这是所有线程的过程中共享,后面线程明智锁保护。每次调用acquire()都会增加锁定计数器,并且当计数器为零时还会获得操作系统级别的文件锁定。同样,每次调用release()都会减少锁定计数器,并在计数器达到零时解锁文件。

    因此,如果两个线程获取在同一时间的锁,该文件将被通过在OS水平此进程锁定一次,锁定计数器将由2. 的两个线程不会阻塞增加彼此。

  2. with:的要点是在其范围退出后自动获取并释放该锁。见What is the python "with" statement designed for?

  3. 文件锁定用于防止当前进程之外的文件访问。它不用于线程锁定。使用常规的threading.Lock进行线程锁定。

    # 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(...) 
    

对于实现细节,你可以参考source code of py-filelock