現在我正在研究如何從網站獲取數據儘可能快。爲了獲得更快的速度,我正在考慮使用多線程。這裏是我用來測試多線程和簡單發佈之間區別的代碼。如何在python中使用多線程時獲得更快的速度
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
就像你所看到的,這是一個非常簡單的代碼。首先我設置模式爲「簡單」,我可以得到時間間隔:50s(也許我的速度有點慢:()。然後我設置模式爲「多」,我得到的時間間隔:我從中可以看出,多線程實際上可以提高速度,但結果並不如我想象的那麼好。我想獲得更快的速度。
從調試中,我發現程序主要是阻止在線:open_url = urllib2.urlopen(req, self.data)
,這行代碼需要很多時間來發布和接收來自指定網站的數據。我想也許我可以通過添加time.sleep()
並在urlopen
函數中使用多線程來獲得更快的速度,但我不能這樣做,因爲它的python自己的功能。
如果不考慮服務器阻止發佈速度的可能限制,我還能做些什麼來獲得更快的速度?或我可以修改的任何其他代碼?多謝!
線程是在python一個壞主意,它就會很容易瓶頸並且可以通過GIL被困,嘗試多。 –
@JakobBowyer:線程是一個實現細節,真正的重點是打開多個連接。無論如何,Python中線程的GIL方面都沒有任何作用。 – orlp
@nightcracker,你應該在做出這樣的陳述之前閱讀GIL和線程......從這裏開始:[PyCon 2010:瞭解Python GIL](http://python.mirocommunity.org/video/1479/pycon- 2010-understanding-the-p) –