2012-05-29 2 views
3

Я проектирование немного мягкий, которая включает в себя:Heavy I/O и питон многопроцессорная/многопоточного

  1. Получение ресурса в Интернете,

  2. Некоторое взаимодействие с пользователем (быстрое редактирование ресурса) ,

  3. Некоторая обработка.

Я хотел бы сделать это со многими ресурсами (все они перечислены в списке). Каждый из них независим от других. Поскольку часть редактирования довольно утомительна, я хотел бы облегчить жизнь пользователю (возможно, мне), так что ему не нужно ждать загрузки каждого ресурса. Для простоты мы забываем третью задачу здесь.

Моя идея заключалась в использовании модуля многопоточной обработки или многопроцессорности. Некоторые потоки (скажем, поток 1) будут выполнять «загрузку» заранее, а другую (скажем, поток 2), которые будут взаимодействовать с пользователем на уже загруженном ресурсе.

Вопрос: Как я могу убедиться, что нить 1 всегда впереди, по крайней мере, ресурсов forward_min и в лучшем случае forward_max (forward_max> ahead_min) всегда?

Мне обычно нужно что-то похожее на Queue.Queue (forward_max) (или multiprocessing.Queue (forward_max)), за исключением того, что при достижении опции forward_max вставка блокируется до тех пор, пока в очереди не останется не больше элементов before_min (на самом деле он блокируется до тех пор, пока очередь не будет пустой, см. http://docs.python.org/library/queue.html#module-Queue). Popping также должен быть заблокирован до тех пор, пока в очереди не останется впереди ~min + 1 элементов (в конце последовательности ресурсов я смогу затем вставить некоторые фиктивные объекты, чтобы гарантировать, что даже последний обработанный ресурс).

Любая идея? Если вы думаете о какой-либо более простой альтернативе, пожалуйста, поделитесь!

+0

В python 3, пожалуйста, для упрощения поддержки Unicode – brained

+1

В чем преимущество make_min больше нуля? –

+0

Чтобы быть уверенным, что пользователь никогда не ждет. forward_min не должно быть большим, 2 (или, может быть, даже 1) должно быть достаточно и дать мне душевное спокойствие. – brained

ответ

3

В этом случае я бы предложил подкласс Queue и реализовать свою собственную логику. Это должно быть легкой задачей, поскольку класс implementation класса Queue уже находится в Python.

Вы можете использовать это в качестве шаблона

from queue import Queue 

class MyQueue(Queue): 

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

    def get(self, block=True, timeout=None): 
     ... 
+0

Если бы я мог, я бы проголосовал за +1 за ссылку ... – brained

2

Прежде всего, мне кажется, что threading является более предпочтительным, чем multiprocessing в этом случае, потому что ваша задача кажется более IO связаны, чем ЦП. Затем да, используйте очереди, чтобы настроить связь между различными «модулями». Если по умолчанию для вас недостаточно pop, вы можете играть с Queue.qsize() и реализовать свою собственную логику.