浙江11选5定位走势图:自學Python教程【第七十二節】多線程

浙江11选5任3遗漏 www.ehxis.com 歡迎大家來到自學Python教程教室,上一講我們學習Python的Python 中一個比較有意思的內置函數 reduce,這節課我們來了解Python中多線程的相關內容,來看看吧:

很多人使用 Python 編寫“爬蟲”程序,抓取網上的數據。

舉個例子,通過豆瓣的 API 抓取 30 部影片的信息:

import urllib, time

time_start = time.time()

data = []

for i in range(30):

print 'request movie:', i

id = 1764796 + i

url = 'https://api.douban.com/v2/movie/subject/%d' % id

d = urllib.urlopen(url).read()

data.append(d)

print i, time.time() - time_start

print 'data:', len(data)

參考輸出結果:

> Python test.py

request movie: 0

0 0.741228103638

request movie: 1

1 1.96586918831

...

request movie: 28

28 12.0225770473

request movie: 29

29 12.4063940048

data: 30

程序里用了 time.time() 來計算抓取花費的時間。運行一遍,大約需要十幾秒(根據網絡情況會有差異)。

如果我們想用這套代碼抓取幾萬部電影,就算中間不出什么狀況,估計也得花上好幾個小時。

然而想一下,我們抓一部電影信息的過程是獨立,并不依賴于其他電影的結果。因此沒必要排好隊一部一部地按順序來。那么有沒有什么辦法可以同時抓取好幾部電影?

答案就是:多線程。

來說一種簡單的多線程方法:

Python 里有一個 thread ???,其中提供了一個函數:

start_new_thread(function, args[, kwargs])

function 是開發者定義的線程函數,

args 是傳遞給線程函數的參數,必須是tuple類型,

kwargs 是可選參數。

調用 start_new_thread 之后,會創建一個新的線程,來執行 function 函數。而代碼原本的主線程將繼續往下執行,不再等待 function 的返回。通常情況,線程在 function 執行完畢后結束。

改寫一下前面的代碼,將抓取的部分放在一個函數中:

import urllib, time, thread

def get_content(i):

id = 1764796 + i

url = 'https://api.douban.com/v2/movie/subject/%d' % id

d = urllib.urlopen(url).read()

data.append(d)

print i, time.time() - time_start

print 'data:', len(data)

time_start = time.time()

data = []

for i in range(30):

print 'request movie:', i

thread.start_new_thread(get_content, (i,))

raw_input('press ENTER to exit...\n')

參考輸出結果:

> Python test.py

request movie: 0

request movie: 1

...

request movie: 28

request movie: 29

press ENTER to exit...

1 0.39500784874

data: 1

9 0.428859949112

data: 2

...

data: 28

21 1.03756284714

data: 29

8 2.66121602058

data: 30

因為主線程不在等待函數返回結果,所以在代碼最后,增加了 raw_input,避免程序提前退出。

從輸出結果可以看出:

在程序剛開始運行時,已經發送所有請求

收到的請求并不是按發送順序,先收到就先顯示

總共用時兩秒多

data 里同樣記錄了所有30條結果

所以,對于這種耗時長,但又獨立的任務,使用多線程可以大大提高運行效率。但在代碼層面,可能額外需要做一些處理,保證結果正確。如上例中,如果需要電影信息按 id 排列,就要另行排序。

多線程通?;嵊迷諭縭輾⑹?、文件讀寫、用戶交互等待之類的操作上,以避免程序阻塞,提升用戶體驗或提高執行效率。

多線程的實現方法不止這一種。另外多線程也會帶來一些單線程程序中不會出現的問題。這里只是簡單地開個頭。

恭喜您在Python自學的道路上又堅持了一天,今天我們學習了Python中多線程的相關內容,這節課也是我們帶領大家Python入門的最后一節課,后面的道路還很長,任重而道遠,希望大家堅持下去!

好啦!今天的分享到這里就結束了,希望大家能夠持續關注馬哥教育官網,每天都會有大量優質內容與大家分享!

相關新聞

聯系我們

400-080-6560

在線咨詢:點擊這里給我發消息

郵件:[email protected]

工作時間:周一至周日,09:00-18:30

QR code