如何从一组队列中获取项目?

时间:2010-03-09 18:01:39

标签: python multithreading

假设有两个空的Queue。有没有办法从队列中获取首先得到它的项目?

所以我有一个高匿名代理队列,匿名和透明队列。有些线程可能只需要很高的功能。代理人,而其他人可能同时接受这两个人。而且只是一个人。代理。这就是为什么我不能将它们全部放在一个队列中。

2 个答案:

答案 0 :(得分:0)

您可以依次检查两个队列,每次使用短暂超时。这样你最有可能从第一个接收数据的队列中读取。但是,如果您定期获得许多物品,这种解决方案很容易出现竞争条件。

如果是这种情况,您是否有充分理由不仅将数据写入一个队列?

答案 1 :(得分:0)

如果我有这个问题(和“轮询”,即交替尝试每个队列的时间很短,是不可接受的 - 通常是,非常浪费CPU时间等),我会通过设计一个“多队列”解决它object - 一个具有多个条件变量,一个“subqueue”和一个整体。对任何子队列的置位将表示该子队列的特定条件变量以及整个变量。来自特定子队列的get只会等待其特定的条件变量,但是也会有一个“从任何子队列中获取”等待整个条件变量。 (如果需要支持比“从这个特定的子队列中获取”或“从任何子队列中获取”更多的组合,那么就需要支持组合条件变量一样多。)

如果将getput简化为裸骨(无超时,无等待等)并且所有子队列都使用单个整体互斥体(非常小),则编码会简单得多许多互斥体的开销,并且更容易以无死锁的方式编码;-)。这些子队列可以作为“简化队列式鸭子”暴露给现有代码,假定它处理一个普通的旧队列(例如,多队列可以支持索引以返回代理对象)。

有了这些假设,代码就不算多了,尽管编写和检查正确性会非常棘手(唉,当非常微妙的线程代码在进行时,测试的用途有限) - 我不能现在花点时间,虽然我很乐意今晚(从现在起8小时左右)尝试一下,如果假设大致正确,没有其他优选答案浮出水面。