3

我正在设计一个有点软的东西,其中包括:

  1. 在互联网上获取资源,

  2. 一些用户交互(资源的快速编辑),

  3. 一些处理。

我想用很多资源来做到这一点(它们都列在一个列表中)。每个都独立于其他。由于编辑部分很累,我想让用户(可能是我)的生活更轻松,这样他就不必等待每个资源的下载。为简单起见,我们在这里忘记了第三个任务。

我的想法是使用线程或多处理模块。一些线程(比如线程 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)。弹出也应该被阻止,直到队列中至少有 ahead_min+1 个元素(在资源序列的末尾,我可以插入一些虚拟对象以确保处理最后一个资源)。

任何的想法?如果您想到任何更简单的替代方案,请分享!

4

2 回答 2

3

在这种情况下,我建议子类化Queue并实现您自己的逻辑。这应该是一件容易的事,因为该类的实现已经Queue在 Python 中了。

您可以将其用作模板

from queue import Queue

class MyQueue(Queue):

    def put(self, item, block=True, timeout=None):
        ...

    def get(self, block=True, timeout=None):
        ...
于 2012-05-29T13:39:56.673 回答
2

首先,在这种情况下似乎threading更可取multiprocessing,因为您的任务似乎比 CPU 更受 IO 限制。然后,是的,利用队列来建立不同“模块”之间的通信。如果默认pop行为对您来说还不够,您可以使用Queue.qsize()并实现自己的逻辑。

于 2012-05-29T13:42:53.833 回答