重I / O和python多处理/多线程

时间:2012-05-29 13:22:17

标签: python multithreading queue multiprocessing

我正在设计一点涉及的软件:

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

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

  3. 一些处理。

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

    我的想法是使用线程或多处理模块。某个线程(比如线程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个元素(在资源序列的末尾,我可以插入一些虚拟对象以确保即使处理最后一个资源)。

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

2 个答案:

答案 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()并实现自己的逻辑。