2016-08-06 3 views
2

Я собираюсь написать программу с несколькими процессами (переполненную процессором) и многопоточными (IO-переполненными). (Код ниже только образец, а не программа)python multiprocessing.Process's join не может закончиться

Но когда код соответствует join(), он превращает программу в тупик.

Мой код пост ниже

import requests 
import time 
from multiprocessing import Process, Queue 
from multiprocessing.dummy import Pool 


start = time.time() 
queue = Queue() 
rQueue = Queue() 
url = 'http://www.bilibili.com/video/av' 
for i in xrange(10): 
    queue.put(url+str(i)) 


def goURLsCrawl(queue, rQueue): 
    threadPool = Pool(7) 
    while not queue.empty(): 
     threadPool.apply_async(urlsCrawl, args=(queue.get(), rQueue)) 
    threadPool.close() 
    threadPool.join() 
    print 'end' 


def urlsCrawl(url, rQueue): 
    response = requests.get(url) 
    rQueue.put(response) 


p = Process(target=goURLsCrawl, args=(queue, rQueue)) 
p.start() 
p.join() # join() is here 
end = time.time() 
print 'totle time %0.4f' % (end-start,) 

Заранее спасибо.

+0

Что вы сделали, чтобы решить эту проблему? Вы посмотрели на это? https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process.join – Munchhausen

+0

Вау, это странно. Удаление любой строки в 'urlsCrawl' устраняет тупик, но почему? –

+0

@Munchhausen Да, я видел это раньше, но я не нашел ничего плохого в своем коде. Если я удалю команду rQueue.put(), она работает хорошо, и я также обнаружил, что если rQueue пуст, он также работает хорошо. Возможно, проблема связана с Queue.put(). –

ответ

0

Наконец-то я нашел причину. Как вы можете видеть, я импортировать Queue из multiprocessing, поэтому Queue должен использоваться только для процесса, но я делаю темы доступ к Queue на моем коде, так что он должен что-то неизвестное происходит за программой.

Чтобы исправить это, просто импортировать Queue вместо multiprocessing.Queue

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