真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python線程池類函數(shù) python中線程池

python 多線程爬取網(wǎng)站數(shù)據(jù)利用線程池

"""

成都創(chuàng)新互聯(lián)于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都網(wǎng)站制作、網(wǎng)站設計網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元攀枝花做網(wǎng)站,已為上家服務,為攀枝花各地企業(yè)和個人服務,聯(lián)系電話:028-86922220

@author: wangxingchun

多線程(線程池)

下載數(shù)據(jù)

"""

import requests

import csv

from concurrent.futures import ThreadPoolExecutor as tp

#創(chuàng)建一個csv文件,注意創(chuàng)建writer對象"csv.writer()"

f = open('xinfadi.csv','w',encoding='utf8')

csvwrite = csv.writer(f)

#如果寫入txt文件,不需要創(chuàng)建writer對象。

# f = open('xinfadidata.txt','w',encoding='utf8')

#創(chuàng)建一個函數(shù),以頁碼做為參數(shù)

def down(n_page):

url = ''

data = {'count': 428225,'current': n_page,'limit': 20}

resp = requests.post(url,data=data)

datas =resp.json()

#通過分析數(shù)據(jù)嵌套情況,獲取數(shù)據(jù)。此處可在網(wǎng)頁開發(fā)工具json數(shù)據(jù)中查看分析。

for i in range(len(datas['list'])):

name = datas['list'][i]['prodName']

highPrice = datas['list'][i]['highPrice']

lowPrice = datas['list'][i]['lowPrice']

pubDate = datas['list'][i]['pubDate']

place = datas['list'][i]['place']

csvwrite.writerow((name,highPrice,lowPrice,pubDate,place))#writerow要求寫入的是可迭代對象

# f.writelines(f'{name},{highPrice},{lowPrice},{pubDate},{place} ')

resp.close()

if __name__ == '__main__':

with tp(50) as t: #創(chuàng)建線程池,

for n in range(1,101): #遍歷數(shù)據(jù)網(wǎng)頁

t.submit(down,n) #提交給線程池,進行多線程下載

print(f'共{n}頁數(shù)據(jù)下載完畢!')

f.close()

python 線程池的使用

最近在做一個爬蟲相關的項目,單線程的整站爬蟲,耗時真的不是一般的巨大,運行一次也是心累,,,所以,要想實現(xiàn)整站爬蟲,多線程是不可避免的,那么python多線程又應該怎樣實現(xiàn)呢?這里主要要幾個問題(關于python多線程的GIL問題就不再說了,網(wǎng)上太多了)。

一、 既然多線程可以縮短程序運行時間,那么,是不是線程數(shù)量越多越好呢?

顯然,并不是,每一個線程的從生成到消亡也是需要時間和資源的,太多的線程會占用過多的系統(tǒng)資源(內(nèi)存開銷,cpu開銷),而且生成太多的線程時間也是可觀的,很可能會得不償失,這里給出一個最佳線程數(shù)量的計算方式:

最佳線程數(shù)的獲?。?/p>

1、通過用戶慢慢遞增來進行性能壓測,觀察QPS(即每秒的響應請求數(shù),也即是最大吞吐能力。),響應時間

2、根據(jù)公式計算:服務器端最佳線程數(shù)量=((線程等待時間+線程cpu時間)/線程cpu時間) * cpu數(shù)量

3、單用戶壓測,查看CPU的消耗,然后直接乘以百分比,再進行壓測,一般這個值的附近應該就是最佳線程數(shù)量。

二、為什么要使用線程池?

對于任務數(shù)量不斷增加的程序,每有一個任務就生成一個線程,最終會導致線程數(shù)量的失控,例如,整站爬蟲,假設初始只有一個鏈接a,那么,這個時候只啟動一個線程,運行之后,得到這個鏈接對應頁面上的b,c,d,,,等等新的鏈接,作為新任務,這個時候,就要為這些新的鏈接生成新的線程,線程數(shù)量暴漲。在之后的運行中,線程數(shù)量還會不停的增加,完全無法控制。所以,對于任務數(shù)量不端增加的程序,固定線程數(shù)量的線程池是必要的。

三、如何使用線程池

過去使用threadpool模塊,現(xiàn)在一般使用concurrent.futures模塊,這個模塊是python3中自帶的模塊,但是,python2.7以上版本也可以安裝使用,具體使用方式如下:

注意到:

concurrent.futures.ThreadPoolExecutor,在提交任務的時候,有兩種方式,一種是submit()函數(shù),另一種是map()函數(shù),兩者的主要區(qū)別在于:

python多線程并行計算通過向線程池ThreadPoolExecutor提交任務的實現(xiàn)方法

Python的線程池可以有效地控制系統(tǒng)中并發(fā)線程的數(shù)量。

當程序中需要創(chuàng)建許多生存期較短的線程執(zhí)行運算任務時,首先考慮使用線程池。線程池任務啟動時會創(chuàng)建出最大線程數(shù)參數(shù) max_workers 指定數(shù)量的空閑線程,程序只要將執(zhí)行函數(shù)提交給線程池,線程池就會啟動一個空閑的線程來執(zhí)行它。當該函數(shù)執(zhí)行結束后,該線程并不會死亡,而是再次返回到線程池中變成空閑狀態(tài),等待執(zhí)行下一個函數(shù)。配合使用 with 關鍵字實現(xiàn)任務隊列完成后自動關閉線程池釋放資源。

python如何實現(xiàn)線程池

#這個類是線程類,用來在主程序中調(diào)用生成一個線程。其實線程池就是線程的集合地,

#能夠解決有效統(tǒng)一的管理線程,基本就達到了線程池的目的;

#這一段代碼是我的爬蟲程序中的一部分,希望對你有用。

class?Spider(Thread):

def?__init__(self,?todo_list):

super().__init__()

self.setDaemon(True)

self.todo_list?=?todo_list

self.stat?=?IDLE

def?is_idle(self):

return?self.stat?==?IDLE

def?run(self):

while?True:

url?=?self.todo_list.get()

#?開始線程工作

#這個函數(shù)就是主函數(shù)了,????????????

def?main(max_threads):

########這里和上一個函數(shù)就是核心代碼了。

#?創(chuàng)建?N?個線程,并啟動

print('Spawn?spiders')

spiders?=?[Spider(todo_list)?for?i?in?range(max_threads)]

for?spd?in?spiders:

spd.start()

#python主運行代碼:????????????

if?__name__?==?'__main__':

main(max_threads)

只能給你這么多解釋了,如果想弄懂,還是要去看看基礎知識的。

另外可以查一下有沒有封裝好的三方庫。


網(wǎng)頁題目:python線程池類函數(shù) python中線程池
URL鏈接:http://weahome.cn/article/dopcocs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部