現在、ウェブサイトからできるだけ早くデータを取得する方法を研究しています。より高速にするために、マルチスレッドの使用を検討しています。マルチスレッドとシンプルな投稿の違いをテストするために使用したコードを次に示します。
import threading
import time
import urllib
import urllib2
class Post:
def __init__(self, website, data, mode):
self.website = website
self.data = data
#mode is either "Simple"(Simple POST) or "Multiple"(Multi-thread POST)
self.mode = mode
def post(self):
#post data
req = urllib2.Request(self.website)
open_url = urllib2.urlopen(req, self.data)
if self.mode == "Multiple":
time.sleep(0.001)
#read HTMLData
HTMLData = open_url.read()
print "OK"
if __name__ == "__main__":
current_post = Post("http://forum.xda-developers.com/login.php", "vb_login_username=test&vb_login_password&securitytoken=guest&do=login", \
"Simple")
#save the time before post data
origin_time = time.time()
if(current_post.mode == "Multiple"):
#multithreading POST
for i in range(0, 10):
thread = threading.Thread(target = current_post.post)
thread.start()
thread.join()
#calculate the time interval
time_interval = time.time() - origin_time
print time_interval
if(current_post.mode == "Simple"):
#simple POST
for i in range(0, 10):
current_post.post()
#calculate the time interval
time_interval = time.time() - origin_time
print time_interval
ご覧のとおり、これは非常に単純なコードです。最初にモードを「シンプル」に設定すると、時間間隔を取得できます: 50 秒(おそらく私の速度は少し遅い :(). 次に、モードを「マルチ」に設定すると、時間間隔: 35が取得されます。その結果、マルチスレッドは実際に速度を上げることができますが、結果は私が想像するほど良くありません. もっと高速にしたい.
デバッグから、プログラムが主に行でブロックすることがわかりました: open_url = urllib2.urlopen(req, self.data)
、このコード行は、指定された Web サイトからのデータの投稿と受信に多くの時間を要します。time.sleep()
関数内にマルチスレッドを追加して使用することで速度を上げることができると思いurlopen
ますが、Python独自の関数であるため、それを行うことはできません。
サーバーが投稿速度をブロックする可能性のある制限を考慮していない場合、より速い速度を得るために他に何ができますか? または私が変更できる他のコードはありますか?ありがとう!