我正在设计一点涉及的软件:
在互联网上获取资源,
一些用户互动(快速编辑资源),
一些处理。
我想用很多资源(它们都列在列表中)这样做。每个都独立于其他人。由于编辑部分非常疲惫,我想让用户(可能是我)的生活更轻松,这样他就不必等待每个资源的下载。为简单起见,我们忘记了第三项任务。
我的想法是使用线程或多处理模块。某个线程(比如线程1)会提前进行“下载”,而另一个线程(比如线程2)会在已经下载的资源上与用户进行交互。
问题:如何确保线程1始终至少超前于ahead_min资源,并且始终最多在ahead_max(ahead_max> ahead_min)之前?
我通常需要类似于Queue.Queue(ahead_max)(或multiprocessing.Queue(ahead_max))的东西,除了当达到ahead_max时,插入被阻塞,直到队列中剩余最多的ahead_min元素为止(事实上它阻塞直到队列为空,请参阅http://docs.python.org/library/queue.html#module-Queue)。弹出也应该被阻塞,直到队列中至少有advance_min + 1个元素(在资源序列的末尾,我可以插入一些虚拟对象以确保即使处理最后一个资源)。
有什么想法吗?如果您想到任何更简单的替代方案,请分享!
答案 0 :(得分:3)
在这种情况下,我建议继承Queue
并实现自己的逻辑。这应该是一项简单的任务,因为Queue
类的implementation已经在Python中。
您可以将其用作模板
from queue import Queue
class MyQueue(Queue):
def put(self, item, block=True, timeout=None):
...
def get(self, block=True, timeout=None):
...
答案 1 :(得分:2)
首先,在这种情况下,似乎threading
优于multiprocessing
,因为您的任务似乎比CPU绑定更多IO绑定。然后,是的,利用队列来建立不同“模块”之间的通信。如果默认的pop
行为不够,您可以使用Queue.qsize()
并实现自己的逻辑。