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,)
おかげで以下のポストです。
問題に取り組むために何をしたの
Queue
をインポートし、それを修正するには?あなたはこれを見ましたか? https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process.join – Munchhausenうわー、それは変です。 'urlsCrawl'のいずれかの行を削除するとデッドロックが修正されますが、なぜですか? –
@Munchhausenはい、私は以前これを見ましたが、自分のコードに何か間違ったものは見つかりませんでした。 rQueue.put()コマンドを削除すると正常に動作します。また、rQueueが空であれば正常に動作することもわかります。問題はQueue.put()に関連しているかもしれません。 –