假设我有一个由两个单独的线程和一个队列组成的多线程应用程序。线程 1 完成它的计算并将结果放入队列中。同时线程 2 不断循环并检查队列中是否有任何数据供其处理。
如果由于某种原因程序故障或计算机重新启动,如何将队列中的值临时保存到磁盘?在第一个线程完成后将值保存在 SQLite DB 中,然后在线程 2 完成后将其删除是否合理?
如果 SQLite 实际上是最好的解决方案,是在一行上插入一个标志,表示它已被处理,并且每半小时有另一个线程通过并删除那些被标记的行,还是立即删除该行?
假设我有一个由两个单独的线程和一个队列组成的多线程应用程序。线程 1 完成它的计算并将结果放入队列中。同时线程 2 不断循环并检查队列中是否有任何数据供其处理。
如果由于某种原因程序故障或计算机重新启动,如何将队列中的值临时保存到磁盘?在第一个线程完成后将值保存在 SQLite DB 中,然后在线程 2 完成后将其删除是否合理?
如果 SQLite 实际上是最好的解决方案,是在一行上插入一个标志,表示它已被处理,并且每半小时有另一个线程通过并删除那些被标记的行,还是立即删除该行?
不要在这里自己动手。异步处理例程、可重启性、程序故障等最好使用消息队列进行管理。
您可以使用Windows 的内置程序,使用 Apache Software Foundation 的ActiveMQ开源,或者通过Amazon 的 Simple Queue Service使用云中的 Web服务。
有很多不同的方式可以去这里。在自己重复功能之前调查这些选项。这些领域的可靠性比您预期的更具挑战性。
我根本不会将队列存储在内存中 - 只是将它存储在 SQL Lite 上。如果线程 1 只是添加到队列中并且线程 2 是唯一的读取,那么只需让线程 2 在处理完该行后立即删除该行。
当然,出于性能原因,线程 2 在检查队列之前的等待间隔越长越好。
一种解决方案是使用队列服务器,例如 Zero-MQ、RabbitMQ 或(商业)Tibco EMS 或 Websphere MQ。