带SQLite的有序并发队列实现(Twisted)?
我想用twisted框架设计一个应用程序,里面有一些延迟操作(deferreds),可以把多个字段的元素添加到一个队列里。
这个队列会被应用程序用其他的延迟操作来处理。问题是,我希望处理队列里的元素时,不是按照添加的顺序,而是根据元素的内容给某些元素更高的优先级。
我现在的想法(可能有点问题)是使用一个生成器,这个生成器执行一个SQL查询,得到一个按优先级排列的结果集,然后遍历这个结果集来生成延迟操作。问题是,当生成器在遍历结果集的时候,可能会有新的元素被其他延迟操作添加到队列里。
有没有办法在每次调用生成器的时候,不用重新执行查询?也就是说,能不能让“结果集”和迭代器的游标自动“更新”?
如果不能,那你会怎么实现这个功能呢?
2 个回答
1
为什么不直接用Python的列表,配合标准库里的“heapq”模块来保持优先级顺序呢?(你的列表元素可以是元组,包含(优先级,插入时间,对象)——因为数据保存在普通的Python列表里,所以在一个twisted应用中传递起来没有问题。)
我觉得如果你只需要按优先级排序,这样做会比使用sqlite简单得多。
(在这个回答里,我提供了一个heapq的使用示例,可能会对你有帮助:heapq与自定义比较函数)
2
队列模块里有一个叫做 PriorityQueue 的类,可能正好符合你的需求。