2016-02-04 2 views
1

Путаница с использованием пула с списком в очереди. Я получаю ошибку: TypeError: объект 'int' не является итерабельным при передаче q.get вместо списка. Надеюсь, это просто недосмотр.Передача очереди в Threadpool - Python

from multiprocessing.dummy import Pool 
import Queue 

numbers = [11,12,13,14] 

def printNumbers(n): 
    print n 

q = Queue.Queue()  
for i in (1,2,3,4): 
    q.put(i) 

#multiThread with list numbers 
pool = Pool(4) 
results = pool.map(printNumbers, numbers) 
pool.close() 
pool.join() 

#multiThread with queue 
pool2 = Pool(4) 
results2 = pool2.map(printNumbers, q.get()) 
pool2.close() 
pool2.join() 
+0

Почему вы хотите использовать очередь на этом этапе. И кстати. помните о различиях потоков и многопроцессов. –

+1

Очередь, поскольку она будет расти по мере того, как потоки вытягиваются из нее (исследование потока и многопроцессорности теперь). Конечная цель - это скрипт, который перемещается по каталогу и создает переменную fileInfo var, используемую в команде pycurl, а затем выводит в журнал. В настоящий момент в порядке -> проведите прогулку, возьмите следующий файл, потяните информацию с корневого пути, загрузите через curl, выведите на вход/сбой журнала. Нанесение огромных временных задержек на завиту, поэтому с помощью потоков Будущая цель -> Прогулка по парку, заполнение очереди с информацией о файле -> вытащить из очереди с несколькими потоками, выполняющими команду curl -> заполнить logQueue с успехом/неудачей -> функция pull от logQueue до Написать – Tyler

ответ

1

Класс Queue не реализует итерируемый протокол. Вы должны будете предоставить свою собственную реализацию Queue. Вот пример:

class IterableQueue(Queue.Queue): 

    _sentinel = object() 

    def __init__(self, maxsize=0): 
     Queue.Queue.__init__(self, maxsize) 
     self.put(self._sentinel) 

    def __iter__(self): 
     return iter(self.get, self._sentinel) 

Вы можете прочитать подробную информацию о __iter__ и как дозорный используются при https://docs.python.org/2/library/functions.html#iter

Пожалуйста, обратите внимание, что мой пример очередь не то, что вы хотите, если вы хотите очереди, которая будет блокировать когда пуст, пока не будет добавлено больше элементов. Для этого см. Python iterable Queue

Однако, когда я использовал эту версию с вашим кодом, она никогда не прерывалась. Чтобы использовать это, вам нужно немного перестроить структуру, чтобы вы могли вызвать метод close, когда знаете, что у вас больше нет элементов для добавления в очередь.

Смежные вопросы