国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python爬蟲之線程池和進程池功能與用法詳解

2020-02-15 22:38:32
字體:
來源:轉載
供稿:網友

本文實例講述了python爬蟲之線程池和進程池功能與用法。分享給大家供大家參考,具體如下:

一、需求

最近準備爬取某電商網站的數據,先不考慮代理、分布式,先說效率問題(當然你要是請求的太快就會被封掉,親測,400個請求過去,服務器直接拒絕連接,心碎),步入正題。一般情況下小白的我們第一個想到的是for循環,這個可是單線程啊。那我們考慮for循環直接開他個5個線程,問題來了,如果有一個url請求還沒有回來,后面的就干等,這么用多線程等于沒用,到處貼創可貼。

二、性能考慮

確定要用多線程或者多進程了,那我們到底是用多線程還是多進程,有些人對多進程和多線程有一定的偏見,就因為python的GIL鎖,下面我們說一下這兩個東西的差別。

三、多線程:

一般情況下我們啟動一個.py文件,就等于啟動了一個進程,一個進程里面默認有一個線程工作,我們使用的多線程的意思就是在一個進程里面啟用多個線程。但問題來了,為什么要使用多線程呢?我知道啟動一個進程的時候需要創建一些內存空間,就相當于一間房子,我們要在這個房子里面干活,你可以想一個人就等于一個線程,你房子里面有10個人的空間跟有20個人的空間,正常情況下是不一樣的,因為我們知道線程和線程之間默認是可以通信的(進程之間默認是不可以通信的,不過可以用技術實現,比如說管道)。可以多線程為了保證計算數據的正確性,所以出現了GIL鎖,保證同一時間只能有一個線程在計算。GIL鎖你可以基本理解為,比如在這個房間里要算一筆賬,在同一時間內只能有一個人在算這筆賬,想一個問題,如果這筆賬5個人就能算清楚,我需要10平米的房間就行,那為什么要請10個人,花20平米呢?所以并不是開的線程越多越好。但是,但是,但是,注意大家不用動腦筋(CPU計算)算這筆賬的時候可以去干別的事(比如說5個人分工,各算一部分),比如說各自把自己算完后的結果記錄在賬本上以便后面對賬,這個的話每個人都有自己的賬本,所以多線程適合IO操作,記住了就算是適合IO操作,也不代表說人越多越好,所以這個量還是得根據實際情況而定。

線程池示例:

import requestsfrom concurrent.futures import ThreadPoolExecutorurls_list = [  'https://www.baidu.com',  'http://www.gaosiedu.com',  'https://www.jd.com',  'https://www.taobao.com',  'https://news.baidu.com',]pool = ThreadPoolExecutor(3)def request(url):  response = requests.get(url)  return responsedef read_data(future,*args,**kwargs):  response = future.result()  response.encoding = 'utf-8'  print(response.status_code,response.url)def main():  for url in urls_list:    done = pool.submit(request,url)    done.add_done_callback(read_data)if __name__ == '__main__':  main()  pool.shutdown(wait=True)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长兴县| 准格尔旗| 德昌县| 神农架林区| 赤峰市| 湾仔区| 尉犁县| 新津县| 阳山县| 微博| 绥滨县| 金川县| 治县。| 鸡东县| 临沧市| 峨眉山市| 成都市| 长海县| 阿合奇县| 开原市| 资中县| 界首市| 阿图什市| 高邮市| 海南省| 嵊州市| 崇义县| 乡城县| 山丹县| 乌拉特中旗| 刚察县| 澎湖县| 板桥市| 临西县| 穆棱市| 涪陵区| 千阳县| 专栏| 罗平县| 桃园县| 周至县|