欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Python中多線(xiàn)程、多進(jìn)程、協(xié)程的區(qū)別是什么

今天就跟大家聊聊有關(guān)Python中多線(xiàn)程、多進(jìn)程、協(xié)程的區(qū)別是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

發(fā)展壯大離不開(kāi)廣大客戶(hù)長(zhǎng)期以來(lái)的信賴(lài)與支持,我們將始終秉承“誠(chéng)信為本、服務(wù)至上”的服務(wù)理念,堅(jiān)持“二合一”的優(yōu)良服務(wù)模式,真誠(chéng)服務(wù)每家企業(yè),認(rèn)真做好每個(gè)細(xì)節(jié),不斷完善自我,成就企業(yè),實(shí)現(xiàn)共贏(yíng)。行業(yè)涉及成都木制涼亭等,在重慶網(wǎng)站建設(shè)公司、成都營(yíng)銷(xiāo)網(wǎng)站建設(shè)、WAP手機(jī)網(wǎng)站、VI設(shè)計(jì)、軟件開(kāi)發(fā)等項(xiàng)目上具有豐富的設(shè)計(jì)經(jīng)驗(yàn)。

首先我們寫(xiě)一個(gè)簡(jiǎn)化的爬蟲(chóng),對(duì)各個(gè)功能細(xì)分,有意識(shí)進(jìn)行函數(shù)式編程。下面代碼的目的是訪(fǎng)問(wèn)300次百度頁(yè)面并返回狀態(tài)碼,其中parse_1函數(shù)可以設(shè)定循環(huán)次數(shù),每次循環(huán)將當(dāng)前循環(huán)數(shù)(從0開(kāi)始)和url傳入parse_2函數(shù)。

import requests  def parse_1():     url = 'https://www.baidu.com'     for i in range(300):         parse_2(url)  def parse_2(url):     response = requests.get(url)     print(response.status_code)  if __name__ == '__main__':     parse_1()

性能的消耗主要在IO請(qǐng)求中,當(dāng)單進(jìn)程單線(xiàn)程模式下請(qǐng)求URL時(shí)必然會(huì)引起等待

示例代碼就是典型的串行邏輯,parse_1將url和循環(huán)數(shù)傳遞給parse_2,parse_2請(qǐng)求并返回狀態(tài)碼后parse_1繼續(xù)迭代一次,重復(fù)之前步驟

三、多線(xiàn)程

因?yàn)镃PU在執(zhí)行程序時(shí)每個(gè)時(shí)間刻度上只會(huì)存在一個(gè)線(xiàn)程,因此多線(xiàn)程實(shí)際上提高了進(jìn)程的使用率從而提高了CPU的使用率

實(shí)現(xiàn)多線(xiàn)程的庫(kù)有很多,這里用concurrent.futures中的ThreadPoolExecutor來(lái)演示。介紹ThreadPoolExecutor庫(kù)是因?yàn)樗啾绕渌麕?kù)代碼更簡(jiǎn)潔

為了方便說(shuō)明問(wèn)題,下面代碼中如果是新增加的部分,代碼行前會(huì)加上 > 符號(hào)便于觀(guān)察說(shuō)明問(wèn)題,實(shí)際運(yùn)行需要去掉

import requests > from concurrent.futures import ThreadPoolExecutor  def parse_1():     url = 'https://www.baidu.com'     # 建立線(xiàn)程池     > pool = ThreadPoolExecutor(6)     for i in range(300):         > pool.submit(parse_2, url)     > pool.shutdown(wait=True)  def parse_2(url):     response = requests.get(url)     print(response.status_code)  if __name__ == '__main__':     parse_1()

跟同步相對(duì)的就是異步。異步就是彼此獨(dú)立,在等待某事件的過(guò)程中繼續(xù)做自己的事,不需要等待這一事件完成后再工作。線(xiàn)程就是實(shí)現(xiàn)異步的一個(gè)方式,也就是說(shuō)多線(xiàn)程是異步處理異步就意味著不知道處理結(jié)果,有時(shí)候我們需要了解處理結(jié)果,就可以采用回調(diào)

import requests from concurrent.futures import ThreadPoolExecutor  # 增加回調(diào)函數(shù) > def callback(future):     > print(future.result())  def parse_1():     url = 'https://www.baidu.com'     pool = ThreadPoolExecutor(6)     for i in range(300):         > results = pool.submit(parse_2, url)         # 回調(diào)的關(guān)鍵步驟         > results.add_done_callback(callback)     pool.shutdown(wait=True)  def parse_2(url):     response = requests.get(url)     print(response.status_code)  if __name__ == '__main__':     parse_1()

Python實(shí)現(xiàn)多線(xiàn)程有一個(gè)無(wú)數(shù)人詬病的GIL(全局解釋器鎖),但多線(xiàn)程對(duì)于爬取網(wǎng)頁(yè)這種多數(shù)屬于IO密集型的任務(wù)依舊很合適。

四、多進(jìn)程

多進(jìn)程用兩個(gè)方法實(shí)現(xiàn):ProcessPoolExecutor和multiprocessing

1. ProcessPoolExecutor

和實(shí)現(xiàn)多線(xiàn)程的ThreadPoolExecutor類(lèi)似

import requests > from concurrent.futures import ProcessPoolExecutor  def parse_1():     url = 'https://www.baidu.com'     # 建立線(xiàn)程池     > pool = ProcessPoolExecutor(6)     for i in range(300):         > pool.submit(parse_2, url)     > pool.shutdown(wait=True)  def parse_2(url):     response = requests.get(url)     print(response.status_code)  if __name__ == '__main__':     parse_1()

可以看到改動(dòng)了兩次類(lèi)名,代碼依舊很簡(jiǎn)潔,同理也可以添加回調(diào)函數(shù)

import requests from concurrent.futures import ProcessPoolExecutor  > def callback(future):     > print(future.result())  def parse_1():     url = 'https://www.baidu.com'     pool = ProcessPoolExecutor(6)     for i in range(300):         > results = pool.submit(parse_2, url)         > results.add_done_callback(callback)     pool.shutdown(wait=True)  def parse_2(url):     response = requests.get(url)     print(response.status_code)  if __name__ == '__main__':     parse_1()

2. multiprocessing

直接看代碼,一切都在注釋中。

import requests > from multiprocessing import Pool  def parse_1():     url = 'https://www.baidu.com'     # 建池     > pool = Pool(processes=5)     # 存放結(jié)果     > res_lst = []     for i in range(300):         # 把任務(wù)加入池中         > res = pool.apply_async(func=parse_2, args=(url,))         # 獲取完成的結(jié)果(需要取出)         > res_lst.append(res)     # 存放最終結(jié)果(也可以直接存儲(chǔ)或者print)     > good_res_lst = []     > for res in res_lst:         # 利用get獲取處理后的結(jié)果         > good_res = res.get()         # 判斷結(jié)果的好壞         > if good_res:             > good_res_lst.append(good_res)     # 關(guān)閉和等待完成     > pool.close()     > pool.join()  def parse_2(url):     response = requests.get(url)     print(response.status_code)  if __name__ == '__main__':     parse_1()

可以看到multiprocessing庫(kù)的代碼稍繁瑣,但支持更多的拓展。多進(jìn)程和多線(xiàn)程確實(shí)能夠達(dá)到加速的目的,但如果遇到IO阻塞會(huì)出現(xiàn)線(xiàn)程或者進(jìn)程的浪費(fèi),因此有一個(gè)更好的方法……

五、異步非阻塞

協(xié)程+回調(diào)配合動(dòng)態(tài)協(xié)作就可以達(dá)到異步非阻塞的目的,本質(zhì)只用了一個(gè)線(xiàn)程,所以很大程度利用了資源

實(shí)現(xiàn)異步非阻塞經(jīng)典是利用asyncio庫(kù)+yield,為了方便利用逐漸出現(xiàn)了更上層的封裝  aiohttp,要想更好的理解異步非阻塞最好還是深入了解asyncio庫(kù)。而gevent是一個(gè)非常方便實(shí)現(xiàn)協(xié)程的庫(kù)

import requests > from gevent import monkey # 猴子補(bǔ)丁是協(xié)作運(yùn)行的靈魂 > monkey.patch_all() > import gevent  def parse_1():     url = 'https://www.baidu.com'     # 建立任務(wù)列表     > tasks_list = []     for i in range(300):         > task = gevent.spawn(parse_2, url)         > tasks_list.append(task)     > gevent.joinall(tasks_list)  def parse_2(url):     response = requests.get(url)     print(response.status_code)  if __name__ == '__main__':     parse_1()

gevent能很大提速,也引入了新的問(wèn)題:如果我們不想速度太快給服務(wù)器造成太大負(fù)擔(dān)怎么辦?如果是多進(jìn)程多線(xiàn)程的建池方法,可以控制池內(nèi)數(shù)量。如果用gevent想要控制速度也有一個(gè)不錯(cuò)的方法:建立隊(duì)列。gevent中也提供了Quene類(lèi),下面代碼改動(dòng)較大

import requests from gevent import monkey monkey.patch_all() import gevent > from gevent.queue import Queue  def parse_1():     url = 'https://www.baidu.com'     tasks_list = []     # 實(shí)例化隊(duì)列     > quene = Queue()     for i in range(300):         # 全部url壓入隊(duì)列         > quene.put_nowait(url)     # 兩路隊(duì)列     > for _ in range(2):         > task = gevent.spawn(parse_2)         > tasks_list.append(task)     gevent.joinall(tasks_list)  # 不需要傳入?yún)?shù),都在隊(duì)列中 > def parse_2():     # 循環(huán)判斷隊(duì)列是否為空     > while not quene.empty():         # 彈出隊(duì)列         > url = quene.get_nowait()         response = requests.get(url)         # 判斷隊(duì)列狀態(tài)         > print(quene.qsize(), response.status_code)  if __name__ == '__main__':     parse_1()

看完上述內(nèi)容,你們對(duì)Python中多線(xiàn)程、多進(jìn)程、協(xié)程的區(qū)別是什么有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

網(wǎng)站題目:Python中多線(xiàn)程、多進(jìn)程、協(xié)程的區(qū)別是什么
文章轉(zhuǎn)載:http://aaarwkj.com/article4/goosie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、網(wǎng)站內(nèi)鏈、手機(jī)網(wǎng)站建設(shè)云服務(wù)器、自適應(yīng)網(wǎng)站、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
亚洲精品日韩国产3区| 91精品国产自产在线观看| av天堂久久人妻精品加勒比| 日本黄色美女日本黄色| 亚洲中文字幕少妇熟女美妇| 日韩亚洲中文一区三级黄片| 国产精品亚洲在线视频| 999久久久久亚洲精品| 欧美激情欧美精品欧美色浮| 国产在线精品不卡一区| 日韩视频一区二区三区系列| 91午夜福利偷拍视频| 福利在线视频一区二区| 午夜一区二区精品视频国产| 国产成人大片一区二区三区 | a一级成人插少妇的逼| 成年人免费在线观看毛片| 日韩欧美亚洲精品中文字幕αv| 婷婷丁香六月激情综合| 中文字幕日韩精品久久| 日韩一区欧美中文字幕| 少妇高潮喷水下面的水| 欧美丰满老妇性猛交| 五月开心婷婷中文字幕| 国产精品专区日产一区| 91免费看片在线观看| 粉嫩国产av一区二区三区| 永久黄区观看在线网址| 国产叼嘿一区二区视频| 日本欧美一区二区精品| 中文字幕色视频在线观看| 亚洲日本一区二区一本一道| 日日夜夜久久一二三区| 伊人久久精品一区二区| 国产另类极品熟女露脸自拍| 亚洲青青草原自拍偷拍| 欧美日韩国产成人一区| 极品白嫩少妇无套内谢| 日本欧美中文字幕一区| 国产激情盗摄一区二区三区| 国内熟妇人妻色在线三级|