1. 程式人生 > >python 線程池使用

python 線程池使用

ext 運行時間 now() star HA mail sta 策略 lxml

傳統多線程方案會使用“即時創建, 即時銷毀”的策略。盡管與創建進程相比,創建線程的時間已經大大的縮短,但是如果提交給線程的任務是執行時間較短,而且執行次數極其頻繁,那麽服務器將處於不停的創建線程,銷毀線程的狀態。

一個線程的運行時間可以分為3部分:線程的啟動時間、線程體的運行時間和線程的銷毀時間。在多線程處理的情景中,如果線程不能被重用,就意味著每次創建都需要經過啟動、銷毀和運行3個過程。這必然會增加系統相應的時間,降低了效率。

使用線程池:
由於線程預先被創建並放入線程池中,同時處理完當前任務之後並不銷毀而是被安排處理下一個任務,因此能夠避免多次創建線程,從而節省線程創建和銷毀的開銷,能帶來更好的性能和系統穩定性。

體驗一下使用線程池實現爬蟲

在使用前需要安裝線程池類庫:

pip install threadpool

#!/usr/bin/env python 
# coding:utf-8 
# @Time : 2018/4/19 16:06
# @Author : chenjisheng
# @File : 17zwd_sample.py
# @Mail : [email protected]
from bs4 import BeautifulSoup
import threadpool
import requests
import threading
import datetime

baseurl 
= "http://hz.17zwd.com/sks.htm?cateid=0&page=" # 爬蟲函數 def getResponse(url): target = baseurl + url content = requests.get(target).text soup = BeautifulSoup(content, lxml) tags = soup.find_all(div, attrs={"class": "huohao-img-container"}) for tag in tags: imgurl = tag.find(
img).get(data-original) # print(imgurl) # 定義線程為 10 個 starttime = datetime.datetime.now() pool = threadpool.ThreadPool(10) # 定義線程池的任務 tasks = threadpool.makeRequests(getResponse, [str(x) for x in range(1, 11)]) # 使用線程池啟動任務 [pool.putRequest(task) for task in tasks] pool.wait() endtime = datetime.datetime.now() alltime = (endtime - starttime).seconds print("線程池總耗時為: {}秒".format(alltime)) # 傳統線程 starttime1 = datetime.datetime.now() tasklist = [threading.Thread(target=getResponse(str(x))) for x in range(1, 11)] for i in tasklist: i.start() for i in tasklist: i.join() endtime1 = datetime.datetime.now() alltime1 = (endtime1 - starttime1).seconds print("傳統線程總耗時為: {}秒".format(alltime1)) if __name__ == "__main__": pass

最後執行結果: 線程池耗時3秒,傳統線程耗時9秒;

差別還是挺大的哈;

python 線程池使用