我有一个应用程序A调用另一个应用程序B,它执行一些计算并写入文件File.txt A通过多个线程调用B的多个实例,每个实例尝试写入同一个文件File.txt 这是实际问题: 由于多个线程尝试访问同一个文件,因此文件访问会抛出这是常见的。
我尝试了在单例类中使用并发队列的方法,并且B的每个实例都添加到队列中。此类中的另一个线程负责从队列中取消项目,并写入文件File.txt。同步获取队列并写入操作成功。这很好。
如果我有太多的线程和队列中的项太多,文件写入工作,但如果由于某种原因我的队列突然崩溃或停止所有应该写入文件的信息丢失。
如果我在不使用队列的情况下使文件从B写入同步,那么它将会很慢,因为它需要检查文件锁定,但是在B立即写入文件后,数据丢失的可能性较小。
处理这种情况的最佳方法或设计是什么?文件写入完成后我不需要响应。我不能让B等待文件写入完成。
异步等待文件写入在这里有用吗?
答案 0 :(得分:1)
我认为你所做的是最好的。如果仍然存在问题,您可能需要调整生产者/消费者队列解决方案,但在我看来,您已经完成了这种方法。
如果内存中的队列不是答案,那么将其外部化到消息队列和一组侦听器将是一种改进。
关系数据库和事务管理器的诞生是为了解决这个问题。为什么继续基于文件的解决方案?是否有可能探索替代方案?
答案 1 :(得分:1)
是否有更好的方法或设计来处理这种情况?
您可以让每个生产者线程写入自己的滚动文件,而不是对操作进行排队。生产者每隔X秒移动到新文件并唤醒一些聚合线程,读取前面的文件(每个生产者)并将结果写入最终的<script src="https://d3js.org/d3.v3.js"></script>
<div class="row">
<div class="col-sm-12">
<div class="lineChartDiv1" style=" overflow-x: scroll">
</div>
</div>
</div>
输出文件。这里不需要读/写锁。
这可确保安全恢复,因为滚动文件一直存在,直到您处理和删除它们为止。
这也意味着您总是写入磁盘,这比在内存中排队任务要快得多,并且在批量写入磁盘。 但这是您为保持一致性而付出的代价。
异步等待文件写入在这里有用吗?
使用异步IO与此无关。你提到的问题是1)共享资源(输出文件)和2)缺乏一致性(当队列崩溃时),没有一个异步编程。
为什么async在图片中是因为我不想因为这个文件写入操作而延迟B的现有工作
async确实可以帮到你。无论您选择实施哪种模式(解决原始问题),只需使用异步IO api就可以保持异步。