私のアプリケーションは、完了までに時間がかかる複数のI/Oブロック(ネットワーク)要求を使用します。 私はマルチスレッドを使用しようとしましたが、スピードアップを引き起こすようには見えませんでした。私はそれがPythonのGILと関係があると思います。Blocking I/Oを使用したPythonマルチスレッド化
すべてのリクエストは同時に実行でき、互いに依存関係はありません。このパフォーマンスの問題を解決するにはどうすればよいですか?
私のコード
import threading
import urllib2
import time
def send_request(url, count_str):
start_time = time.time()
urllib2.urlopen(url)
print "Request " + count_str + " took " + str(time.time() - start_time) + " started at " + str(start_time)
count = 0
for url in open('urllist.txt'):
t = threading.Thread(target=send_request, args = (url.strip(), str(count)))
t.start()
count+=1
出力が応答するために5秒かかる私はローカルで実行しているサーバーへのurllist.txtポイントで
Request 1 took 5.0150949955 started at 1458789266.78
Request 2 took 10.0112490654 started at 1458789266.79
Request 0 took 15.024559021 started at 1458789266.78
Request 3 took 20.016972065 started at 1458789266.79
のURLです。 ご覧のように、それらはすべて同時に開始しますが、ブロックしています。
私はあなたのコードを表示することができます:) – Signal
@Signal updated it =)私はPythonでマルチスレッド化するのがとても新しいので、かなり間違っている可能性があります –
'q.join()'はどのように返されますか?あなたのコードの中には 'Queue'を処理して' .get() 'だけを呼び出すものはありません。' .task_done() 'だけではありません。 'get_and_read_url'から何も返さないので、' None'をエンキューするだけです。最後に、私は注意します:一般的なスレッド化と特に 'Queue'では、Python 2は_bad_です。最近のPython([3.2以降](https://docs.python.org/3/whatsnew/3.2.html#multi-threading))に移行することができれば、書き直されたGILはスレッド化しても何も得られないCPUに束縛されたタスクでは、GILのオーバーヘッドだけでコアを食べる速度は大幅に遅くなりません。 – ShadowRanger