`from subprocess import check_output,Popen, PIPE
try:
lsout=Popen(['lsof',filename],stdout=PIPE, shell=False)
check_output(["grep",filename], stdin=lsout.stdout, shell=False)
except:
#check_output will throw an exception here if it won't find any process using that file`
有关原子和跨文件系统移动的概念性解释,请参阅此moves in Python(可以真正节省您的时间)
您可以采取以下方法来解决您的问题:-
->;使用Pyinotifyusage of Pynotify监视文件系统事件
->;使用flock将文件锁定几秒钟
->;使用lsof,我们基本上可以检查使用特定文件的进程
只需在except部分编写日志处理代码,就可以开始了
->;一个守护进程,通过使用监视程序库watchdog implementation来监视父文件夹的任何更改
->;您可以通过在/proc中的PID/s循环查找特定id来检查另一个进程正在使用的文件(假设您可以控制不断添加新文件以标识其id的程序)
->;可以使用psutil检查文件上是否有句柄
在编程中,这被称为concurrency,这是指计算同时发生,且执行顺序无法保证的情况。在您的情况下,一个程序在另一个程序完成对文件的写入之前开始读取该文件。这个特殊的问题称为reader-writers problem,实际上在嵌入式系统中相当常见
这个问题有很多解决方案,但最简单和最常见的是lock。最简单的锁可以防止一个资源同时被多个程序访问。实际上,它确保资源上的操作以原子方式进行。锁被实现为一个对象,可以获取或释放(这些通常是对象的函数)。程序尝试在循环中获取锁,只要程序没有获取锁,循环就会迭代。当获得锁时,它会授予持有锁的程序执行某些代码块的能力(这通常是一个简单的if语句),然后释放锁。请注意,我所指的程序通常称为thread
在Python中,可以使用^{} 对象。首先,需要创建一个锁对象
然后在每个线程中,等待获取锁后再继续。如果设置
blocking=True
,它将导致整个线程停止运行,直到获得锁为止,而不需要循环请注意,每个线程中应使用相同的锁对象。在读取和写入文件之前,需要获取锁,在读取和写入文件之后,需要释放锁。这将确保这些操作不会再次同时发生
相关问题 更多 >
编程相关推荐