我寻找其满足以下性质的队列算法:算法基于共享字典数据结构并发队列(单个消费者,多个生产者)
- 进程仅使用一个共享的字典通信(键值-store)
- 不使用超过加载和存储(CAS没有任何其他的原子操作,例如)
- 支持多种生产
- 支持单次消费
- 生产商可以在任何时候死亡和队列必须保持正常运行
- 消费者也可以随时死去,后来被重新启动,但绝不会有不止一个消费过程同时
这是运行意味着作为关于合适算法的一般问题,因为我想在几种不同的情况下使用它。但是,为了帮助可视化的要求,这里有一个例子用例:
- 我有两个页面的网站:producer.html和consumer.html
- producer.html可以同时在多个标签 打开
- 每个producer.html增加事件队列consumer.html的
- 一个副本是开放的,消耗这些事件(聚集和它们流式传输到一个Web服务器,例如)
如果多个生产者 - 标签是由用户而不是页面打开的,这些标签没有可用的引用,所以通常的通信方法(postMessage或直接调用其他标签的JS代码)都没有了。他们仍然可以互相沟通的方式之一是通过LocalStorage建议在这里:Javascript; communication between tabs/windows with same origin。但是LocalStorage不是“线程安全的”,详细here。
注:有可能实现在浏览器(闪存,...)交叉表通信等方式,但这些都是不这个问题的目的,因为他们将不把我的其他使用 - 案例。这实际上只是我试图找到的一般队列算法的一个示例用例。
一对夫妇更参数:
- 生产商的数量将永远不会非常大(几十或几百也许),所以人数的比例读取和写入需要相对于生产商的数量是不是真的担心。
- 我不知道有多少生产者我可能有,并没有立即明确的方式来分配一个数字或索引给他们。 (许多互斥算法(Lamport's Bakery,Eisenberg&McGuire,Szymański's,...)为每个进程维护一个状态数组,但这不一定是一种自然的方法,尽管我不想在事前排除这些方法(如果他们可以的话)使用共享字典以某种方式实现...)
- 算法应该100%可靠。所以,我想避免像Lamport's first Fast Mutex algorithm (page 2 in the PDF)这样的延迟,因为我没有任何实时保证。
- 如果队列是FIFO,将会非常有帮助,但这不是严格要求。
- 该算法不应该受到任何专利缠身等
更新:
的Two-Lock Concurrent Queue Algorithm by Michael and Scott看起来像它可以工作,但我需要两两件事来实现:
- 锁定机制使用共享字典,可以经受一个锁持有人的崩溃
- 一种可靠的方法来分配一个新的节点(如果我将分配移动到锁定的部分,我可以生成新的随机密钥,直到找到一个尚未使用的密钥,但可能有更好的方法?)
更新2:
看来,我是不是约为字典不够具体:
这真的只不过是一个微不足道的键值店更多。它提供功能get(key)
读取密钥的值,put(key, value)
更改密钥的值,delete(key)
删除密钥。在我的一些用例中,我也可以遍历键,但如果可能的话,我想避免它的一般性。密钥是任意的,生产者和消费者可以根据需要创建或计算它们。字典不提供任何自动生成唯一密钥的功能。
示例包括HTML LocalStorage,Google AppEngine的数据存储,Java Map,Python字典或甚至仅包含单个目录的文件系统(其中键为文件名和文件内容的值)。
你能描述字典和队列及更详细的角色,请的关系? – HuStmpHrrr
@HuStmpHrrr字典是进程之间唯一的“共享内存”。每个进程都可以读取和写入由键标识的值。该字典不提供任何并发管理(如原子增量和获取或比较和设置)。因此,队列实现必须以一种聪明的方式存储需要与字典中的其他进程共享的所有数据。除此之外,两者之间没有任何关系。我希望这有帮助。 –
MPSC队列实现可以基于CAS或锁定(我不知道其他方式)。现有的锁定算法需要CAS或每个进程变量,以* static *列表形式排列。您拥有**既不支持CAS **,也不支持静态进程列表**。看来,你想要的是根本不可能的。 – Tsyvarev