我正在开发一个与USPS运输包名为Dazzle的系统.该系统的一部分包括一个监视守护进程,其目的是获取制表符分隔的值文件,将它们转换为Dazzle识别的XML,并将它们传递给Dazzle以生成标签.这部分工作得很好.但是,我还想要解析Dazzle生成的输出文件并将其导入数据库.
请注意,Dazzle在Windows上运行.我的监控守护进程是用Perl编写的,可以在Linux上运行.我的Linux系统通过Samba安装了Dazzle的输入和输出目录.
Dazzle开始写入输出文件的时间和完成的时间之间存在可测量的延迟.我想知道的是我如何等待Dazzle完成输出文件的编写?我已经尝试打开文件并对其进行flock($fh, LOCK_SH)操作,但这似乎没有任何好处.
编辑:我有一个基于"mobrule"的评论的想法如下.Dazzle用XML编写输出文件.货件中的每个包装都包含在标签中,整个文件都包含在标签中.所以,如果我在文件完成之前就开始阅读文件,我可以在采取行动之前等待合适的结束标记.
另外,我应该提一下我目前正在做的事情.当我检测到已创建输出XML文件时,我尝试解析它.如果解析失败,我会睡觉并再试一次.如果失败了,我会睡两次,然后再试一次,依此类推.这在64秒超时的测试中运行良好.
我想将一个Image绑定到某种控件上,稍后将其删除.
path = @"c:\somePath\somePic.jpg"
FileInfo fi = new FileInfo(path);
Uri uri = new Uri(fi.FullName, UriKind.Absolute);
var img = new System.Windows.Controls.Image();
img.Source = new BitmapImage(uri);
Run Code Online (Sandbox Code Playgroud)
现在这段代码之后我想删除该文件:
fi.Delete();
Run Code Online (Sandbox Code Playgroud)
但是我不能这样做,因为现在正在使用图像.在代码片段1和2之间我可以做什么来释放它?
我一直在尝试锁定文件,以便其他克隆服务无法访问该文件.然后我读取文件,然后在完成后移动文件.使用Move是允许的FileShare.Delete.
然而,在后来的测试中,我们发现如果我们查看网络共享,这种方法不起作用.我感谢我的方法可能不是最好的,但我的具体问题是:
为什么下面的演示对本地文件起作用,而不是针对网络文件?
您可以做得越好,因为我在搜索中发现的信息非常少,表明网络共享与本地磁盘的行为不同.
string sourceFile = @"C:\TestFile.txt";
string localPath = @"C:\MyLocalFolder\TestFile.txt";
string networkPath = @"\\MyMachine\MyNetworkFolder\TestFile.txt";
File.WriteAllText(sourceFile, "Test data");
if (!File.Exists(localPath))
File.Copy(sourceFile, localPath);
foreach (string path in new string[] { localPath, networkPath })
{
using (FileStream fsLock = File.Open(path, FileMode.Open, FileAccess.ReadWrite, (FileShare.Read | FileShare.Delete)))
{
string target = path + ".out";
File.Move(path, target); //This is the point of failure, when working with networkPath
if (File.Exists(target))
File.Delete(target);
}
if (!File.Exists(path))
File.Copy(sourceFile, path);
}
Run Code Online (Sandbox Code Playgroud)
编辑:值得一提的是,如果您希望在锁定到位时将文件从一个网络共享移动到另一个网络共享,则可以正常工作.在锁定时在同一文件共享中移动文件时,似乎只会出现此问题.
我的问题是这样的:我正在使用 aWatchService来获取有关特定文件夹中新文件的通知,现在如果在所述文件夹中移动/复制或创建文件,则会触发事件并返回新文件的名称。现在的问题是,如果我尝试访问该文件并且该文件尚未完全存在(例如复制仍在进行中),则会引发异常。我尝试做的是这样的事情:
RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
FileChannel fc = raf.getChannel();
FileLock lck = fc.lock();
Run Code Online (Sandbox Code Playgroud)
但即使获得了锁,如果我尝试写入文件,有时仍然会引发异常,因为另一个进程仍然有一个打开的句柄。
现在,如何锁定 Java 中的文件以实现真正的独占访问?
我花了很多时间搞清楚如何做到这一点,但没有找到任何有用的解决方案.
这就是我想要做的.我在我的应用程序中生成一个巨大的二进制文件.棘手的是,这个过程需要我偶尔关闭FileStream.现在的问题是,偶尔其他应用程序(即我的病毒扫描程序)正在使用文件未被锁定的这个短暂时刻,以锁定文件本身.或其他应用程序,如Dropbox等......
结果是,下次我需要打开文件流时,它会说它被另一个进程锁定.所有这些只是很少发生,但它发生时仍然很烦人.即使我仍然获得文件访问权限,我仍然不希望dropbox上传此文件直到完成(可能需要几分钟).
我需要的是手动锁定文件的可能性,以便我的应用程序仍然可以在此文件上打开文件流,但在我再次手动解锁之前,没有其他应用程序可以.
我用伪代码画出这样的东西:
File.Lock(filepath);
//... do something that opens and closes filestreams on this file
File.Unlock(filepath);
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?"保持文件流打开"的解决方案无效.我明确地试图避免这种情况,所以请记住这一点.
我正在开发一个多线程应用程序,其中多个线程可能需要独占访问同一文件。我正在寻找一种序列化这些操作的方法。我打算使用flock、lockf或fcntl锁定。然而,使用这些方法,当第一个线程已经拥有锁时,第二个线程尝试锁定文件似乎将被授予,因为这两个线程位于同一进程中。这是根据flock和fnctl的手册页(我猜在linux中lockf是用fnctl实现的)。也得到了另一个问题的支持。那么,在 Linux 中是否有其他方法可以在线程级而不是进程级锁定文件呢?
我提出的一些我不喜欢的替代方案是:
1) 使用通过 O_CREAT | 打开的锁文件 (xxx.lock) O_EXCL 标志。如果存在争用,则此调用仅在一个线程中成功。这样做的问题是,其他线程必须在调用上旋转,直到它们获得锁定,这意味着我必须 _yield() 或 sleep() ,这让我认为这不是一个很好的选择。
2) 保留所有打开文件的互斥列表。当线程想要打开/关闭文件时,它必须首先锁定列表。打开文件时,它会搜索列表以查看它是否已打开。这听起来特别低效,因为即使文件尚未被拥有,它也需要大量的工作。
还有其他方法可以做到这一点吗?
编辑: 我刚刚在系统的手册页中发现了这段文本,但它不在在线手册页中:
如果进程使用 open(2) (或类似的)来获取同一文件的多个描述符,则这些描述符将由 flock() 独立处理。使用这些文件描述符之一锁定文件的尝试可能会被调用进程已经通过另一个描述符放置的锁拒绝。
我对“可能被拒绝”这个词不满意,我更喜欢“将被拒绝”,但我想是时候测试一下了。
考虑这样一种情况:两个进程同时尝试使用某个文件放置一个独占锁flock(fd, LOCK_EX|LOCK_NB).
如上所述,尝试是非阻塞的,因此两个进程中的一个应该失败EWOULDBLOCK.
这是我的问题:(Linux)实现是否flock()保证两个进程中的一个在每种情况下都会成功?或者,EWOULDBLOCK即使没有其他人干扰,它们是否有可能最终失败?
简而言之,可以flock(fd, LOCK_EX|LOCK_NB)虚假地失败EWOULDBLOCK吗?
我主要对flock()Linux提供的版本感兴趣,但是flock()欢迎关于其他系统(如OS X)的信息.
此外,我假设答案是相同的,无论锁是独占(LOCK_EX)还是共享(LOCK_SH).如果没有,请告诉我.
我正忙于为使用 Ionic Zip 库来管理数据的现有 C# (4.0) 应用程序开发附加模块。在我的模块中,我需要从 zip 文件加载数据,操作它们,然后再次写回。我的例程在单元测试中运行正常,但是当从主机应用程序中调用时,它会引发异常读取“该进程无法访问该文件,因为它正在被另一个进程使用”。当我尝试调用Save()Zip 存档的函数时,就会发生这种情况。
我检查了哪个进程实际锁定了文件,它恰好是应用程序本身。因此,我得出结论,主机程序可能存在某种干扰:例如,文件流在某个地方打开但未关闭。(顺便说一句,有没有一些聪明的技巧来照顾这些地方?)
令我困惑的是,在处理文件时,Ionic 的 ZipFile 是否真的锁定/解锁文件,如以下代码段所示:
ZipFile zf = new ZipFile("test01.zip");
zf.Save();
// FileSystemTools.WhoIsLocking is a utility showing a list pf processes
// holding access to a given file
// Similar to http://stackoverflow.com/questions/1304/how-to-check-for-file-lock/20623302#20623302
List<Process> processes = FileSystemTools.WhoIsLocking("test01.zip");
Assert.That(processes.Count == 1);
zf.Dispose();
processes = FileSystemTools.WhoIsLocking("test01.zip");
Assert.That(processes.Count == 0);
Run Code Online (Sandbox Code Playgroud)
在Save()锁定进程数为 1(正在运行的进程本身)之后,但在Dispose()没有之后,这证明 Ionic.ZipFile 显然在内部持有一些文件流并以某种方式管理它们。然而,在其他地方,则Dispose()没有效果:锁定进程的数量不会递减。Iconic.Zip 文档很少而且没有说服力。
我有超过 3 个 java 进程访问同一文件进行读写。每个进程都有多个线程,对文件的读写非常频繁(1秒10次左右)。
我用于java.nio.channels.FileLock进程间文件锁定。以及commonObj.wait() commonObj.notify()线程间同步。
我在此实施中面临的问题是 -
java.io.IOException: Resource deadlock avoided其中一个进程发生异常。我的问题是,
我已经为所有 java 进程编写了通用的读写器类。附上一样的。
package json_file_handler;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.channels.OverlappingFileLockException;
import java.util.concurrent.locks.ReentrantLock;
import org.apache.log4j.Logger;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
public class JsonReader {
final static Logger logger = Logger.getLogger(JsonReader.class);
static final ReentrantLock relock = new ReentrantLock();
/**
* Read given file …Run Code Online (Sandbox Code Playgroud)java multithreading synchronization file-locking interprocess
我有一个使用 fastapi 的异步 http web 服务。我在服务器上的不同端口上运行同一服务的多个实例,并且前面有一个 nginx 服务器,因此我可以利用它们。我有一个特定的资源,需要保护只有一个客户端可以访问它。
@app.get("/do_something")
async def do_something():
critical_section_here()
Run Code Online (Sandbox Code Playgroud)
我尝试使用如下文件锁来保护这个关键部分:
@app.get("/do_something")
async def do_something():
with FileLock("dosomething.lock"):
critical_section()
Run Code Online (Sandbox Code Playgroud)
这样可以防止多个进程同时进入临界区。但我发现这实际上会死锁。考虑以下事件:
有没有一种方法可以让我协调这些进程,以便只有其中一个进程访问关键部分?我想过为文件锁添加超时,但我真的不想拒绝用户,我只想等到轮到他/她进入临界区。
python synchronization file-locking multiprocessing python-asyncio