URLを複数回取得する必要がある小さなクローラを作成しています。すべてのスレッドを同時に(同時に)実行します。同時に複数のスレッドをPythonで実行することは可能ですか?
私はこれを行うコードを少し書いています。それはスレッドが同時に実行されているように、要求の間にほとんど隙間があります思われませんApacheのログから
import thread
from urllib2 import Request, urlopen, URLError, HTTPError
def getPAGE(FetchAddress):
attempts = 0
while attempts < 2:
req = Request(FetchAddress, None)
try:
response = urlopen(req, timeout = 8) #fetching the url
print "fetched url %s" % FetchAddress
except HTTPError, e:
print 'The server didn\'t do the request.'
print 'Error code: ', str(e.code) + " address: " + FetchAddress
time.sleep(4)
attempts += 1
except URLError, e:
print 'Failed to reach the server.'
print 'Reason: ', str(e.reason) + " address: " + FetchAddress
time.sleep(4)
attempts += 1
except Exception, e:
print 'Something bad happened in gatPAGE.'
print 'Reason: ', str(e.reason) + " address: " + FetchAddress
time.sleep(4)
attempts += 1
else:
try:
return response.read()
except:
"there was an error with response.read()"
return None
return None
url = ("http://www.domain.com",)
for i in range(1,50):
thread.start_new_thread(getPAGE, url)
、それはほとんど検出できないのですが、私は、スレッドが実際に平行でないことがわかります。
私はGILについて読んだことがありますが、C \ C++コードを呼び出してバイパスする方法はありますか? GILでスレッディングがどのように可能か分かりませんか? Pythonは基本的に、前のスレッドで終了するとすぐに次のスレッドを解釈しますか?
ありがとうございました。
並列で実行されますが、ブロックをurlopenないだろう、それはスレッドが並列にダウンロードすることを意味しますか?サーバーを所有して試してみて、サーバー側に人為的な遅延を3秒間導入してから、スレッドが並列して開始し終了するかどうかを確認する必要があります –