2016-02-08 3 views
1

Я пытаюсь запустить некоторые многопоточного кода в Python, какPython: Многопоточность не работает

from Queue import Queue 
    q = Queue() 
    doclist=["adsas","asdasd","oipoipo"] 
    for i,doc in enumerate(doclist): 
     q.put(doc) 
    q.join() 

    threadRun.run(50, qWorker.worker(q)) 

первый, я создать очередь и добавить некоторые вещи к нему. Затем я вызываю метод, который создает и запускает потоки. Вот threadRun.run метод

import threading 
def run(numThreads,targetMethod): 
    print "Running threads" 
    for i in range(numThreads): 
     t = threading.Thread(target=targetMethod) 
     t.daemon=True 
     t.start() 

и вот qWorker.worker метод

def worker(qItem): 
    print "Q Worker" 
    while True: 
      doc = qItem.get() 

      try: 
       print doc 
       qItem.task_done() 
      except: 
       print "Error" 

Когда я выполнить приведенный выше код, ничего не происходит. Правильно ли мой подход? что мне не хватает?

+1

Ничего не происходит? Он не печатает «Запуск потоков»? –

+0

является 'qWorker.worker (q)' вызываемым объектом? Я думаю, перед вызовом 'run' python, пытающегося вычислить значение' qWorker.worker (q) ' для передачи параметров в поток использовать параметр' args' 'threading.Thread()' class threading.Thread (group = None, target = None, name = None, args =(), kwargs = {}, *, daemon = None) –

+0

Является ли ваш код блоком '__main__'? О чем вы? –

ответ

4

Вы вызываете соединение в очереди перед запуском потоков, чтобы ваш код блокировал его.

Так начинаются потоки затем запустить q.join()

EDIT

Еще одна ошибка является прохождение очереди, это:

threadRun.run(50, qWorker.worker(q)) 

должно быть:

threadRun.run(50, qWorker.worker, q) 

Итак, добавьте очередь как параметр функции запуска и при создании нити делают:

t = threading.Thread(target=targetMethod, args=(q,)) 

Причина вы видели «Q рабочий» выход был, потому что вы на самом деле называется функция работника здесь: threadRun.run(50, qWorker.worker(q))

+0

Это не полная проблема. –

+0

Что делает 'threadRun.run (50, qWorker.worker (q))' do? –

+0

эй, это сработало! Я помещаю вызов threadRun.run() перед q.join() – AbtPst