我有一个包含大量文件的存储桶。 (文件大小低于500kb)。
我想将数据发送到另一个端点并快速完成,我必须设置multithreaded environment on N different machines.
每台计算机都可以访问文件存储桶,而线程会将文件移动到不同的目录。我的问题是:
What will happen if one thread on machine-1 is already moving the file and at the same time thread from machine-2 tries to move the same file
?
它会为thread-2抛出异常,说File找不到?或者两个线程都有机会将同一文件移动到不同的位置。 (这不可取,因为我不想两次处理同一个文件。)
如果它抛出任何类型的异常对我来说没问题,因为我可以抓住它并继续下一个可用文件。但是,如果没有,还有其他机制可以在不同的物理机器之间锁定文件吗?
感谢您抽出时间和帮助!!
答案 0 :(得分:0)
没有。操作系统不允许您从两个不同的线程或应用程序重定位同一文件。我敢说,文件锁定是大多数操作系统的一个相当重要的特性。
那就是说,我对你提出的解决方案有点担心。是的,如果您尝试移动不存在的文件,则会出现异常,但这相当于滥用异常的想法。例外情况只应在异常情况下抛出,在这种情况下,丢失的文件绝对是例外。事实上,这是绝对的预期。
您提出的解决方案可能会为争用文件的线程设置一个相当奇怪的“狂热”。如果你有足够的这些线程试图访问文件,你的某些线程可能实际上只是花时间处理异常而不是做任何实际的工作。
为了解决这个问题,我建议使用某种类型的同步机制,每个线程都可以从中抽取“文件移动分配”,例如队列。这将使您的解决方案更加高效和可扩展。如果没有这样的机制,你会发现自己灭火并使用像Thread.Sleep
...
答案 1 :(得分:0)
完全赞同保罗。
执行此操作的方法是使另一个线程(在持有存储桶的计算机上运行)服务于这些操作,并具有来自不同线程的查询队列。这将消除文件移动时的错误(不要忘记检查文件是否仍然存在)。