100,000 個の URL を含むファイルを開いています。各 URL に HTTP リクエストを送信し、ステータス コードを出力する必要があります。私は Python 2.6 を使用しており、これまで Python がスレッド/並行性を実装する多くの紛らわしい方法を見てきました。Python の同意ライブラリはありますが、このプログラムを正しく記述する方法がわかりません。同様の問題に遭遇した人はいますか? 一般的には、Python で何千ものタスクをできるだけ速く実行する方法を知る必要があると思います。つまり、「並行して」実行するということです。
ベストアンサー1
ねじれのないソリューション:
from urlparse import urlparse
from threading import Thread
import httplib, sys
from Queue import Queue
concurrent = 200
def doWork():
while True:
url = q.get()
status, url = getStatus(url)
doSomethingWithResult(status, url)
q.task_done()
def getStatus(ourl):
try:
url = urlparse(ourl)
conn = httplib.HTTPConnection(url.netloc)
conn.request("HEAD", url.path)
res = conn.getresponse()
return res.status, ourl
except:
return "error", ourl
def doSomethingWithResult(status, url):
print status, url
q = Queue(concurrent * 2)
for i in range(concurrent):
t = Thread(target=doWork)
t.daemon = True
t.start()
try:
for url in open('urllist.txt'):
q.put(url.strip())
q.join()
except KeyboardInterrupt:
sys.exit(1)
これは、ツイストされたソリューションよりもわずかに高速で、CPU の使用量が少なくなります。