2016-08-06 5 views
2

複数のプロセス(CPU混雑)と複数スレッド(IO混雑)を持つプログラムを作成します(プログラムではなく単なるサンプルのコード)Pythonの多重処理です。プロセスの結合を終了できません。

しかし、コードが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

問題に取り組むために何をしたのQueueをインポートし、それを修正するには?あなたはこれを見ましたか? 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を作り、それがプログラムの後ろに、未知の何かが発生しなければなりません。

だけではなく、multiprocessing.Queue

関連する問題