最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文搞懂Python中的進(jìn)程,線程和協(xié)程

 更新時(shí)間:2022年05月05日 09:07:13   作者:Mr.Winter`  
并發(fā)編程是實(shí)現(xiàn)多任務(wù)協(xié)同處理,改善系統(tǒng)性能的方式。Python中實(shí)現(xiàn)并發(fā)編程主要依靠進(jìn)程、線程和協(xié)程,本文將通過示例詳解三者的區(qū)別,感興趣的可以了解一下

1.什么是并發(fā)編程

并發(fā)編程是實(shí)現(xiàn)多任務(wù)協(xié)同處理,改善系統(tǒng)性能的方式。Python中實(shí)現(xiàn)并發(fā)編程主要依靠

進(jìn)程(Process):進(jìn)程是計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)集合的一次運(yùn)行實(shí)例,是操作系統(tǒng)進(jìn)行資源分配的最小單位

線程(Thread):線程被包含在進(jìn)程之中,是操作系統(tǒng)進(jìn)行程序調(diào)度執(zhí)行的最小單位

協(xié)程(Coroutine):協(xié)程是用戶態(tài)執(zhí)行的輕量級(jí)編程模型,由單一線程內(nèi)部發(fā)出控制信號(hào)進(jìn)行調(diào)度

直接上一張圖看看三者概念間的關(guān)系。

這張圖說明了什么?首先,一條線程是進(jìn)程中一個(gè)單一的順序控制流,一個(gè)進(jìn)程可以并發(fā)多個(gè)線程執(zhí)行不同任務(wù)。協(xié)程由單一線程內(nèi)部發(fā)出控制信號(hào)進(jìn)行調(diào)度,而非受到操作系統(tǒng)管理,因此協(xié)程沒有切換開銷和同步鎖機(jī)制,具有極高的執(zhí)行效率。

進(jìn)程、線程、協(xié)程間的特性決定了它們的應(yīng)用場(chǎng)景不同:

協(xié)程常用于IO密集型工作,例如網(wǎng)絡(luò)資源請(qǐng)求等;而進(jìn)程、線程常用于計(jì)算密集型工作,例如科學(xué)計(jì)算、人工神經(jīng)網(wǎng)絡(luò)等。

接下來對(duì)每種并發(fā)編程方法進(jìn)行詳細(xì)闡述。

2.進(jìn)程與多進(jìn)程

Python多進(jìn)程依賴于標(biāo)準(zhǔn)庫mutiprocessing,進(jìn)程類Process的常用方法如下

序號(hào)方法含義
1start()創(chuàng)建一個(gè)Process子進(jìn)程實(shí)例并執(zhí)行該實(shí)例的run()方法
2run()子進(jìn)程需要執(zhí)行的目標(biāo)任務(wù)
3join()主進(jìn)程阻塞等待子進(jìn)程直到子進(jìn)程結(jié)束才繼續(xù)執(zhí)行,可以設(shè)置等待超時(shí)時(shí)間timeout
4terminate()終止子進(jìn)程
5is_alive()判斷子進(jìn)程是否終止
6daemon設(shè)置子進(jìn)程是否隨主進(jìn)程退出而退出

創(chuàng)建多進(jìn)程任務(wù)的實(shí)例如下

import os, time
import multiprocessing

class myProcess(multiprocessing.Process):
    def __init__(self, *args, **kwargs) -> None:
        super().__init__()
        self.name = kwargs['name']

    def run(self):
        print("process name:", self.name)
        for i in range(10):
            print(multiprocessing.current_process(), "process pid:",
                  os.getpid(), "正在執(zhí)行...")
            time.sleep(0.2)

if __name__ == "__main__":
    task = myProcess(name="testProcess")
    task.start()
    task.join()		# 該語句會(huì)阻塞主進(jìn)程直至子進(jìn)程結(jié)束
    print("----------------")

注意:Windows系統(tǒng)在子進(jìn)程結(jié)束后會(huì)立即自動(dòng)清除子進(jìn)程實(shí)例;而Linux系統(tǒng)子進(jìn)程實(shí)例僅當(dāng)主進(jìn)程結(jié)束后才被回收,在子進(jìn)程結(jié)束但主進(jìn)程仍在運(yùn)行的時(shí)間內(nèi)處于僵尸進(jìn)程狀態(tài),會(huì)造成性能損失甚至死鎖。對(duì)子進(jìn)程實(shí)例的手動(dòng)回收可以通過

p.terminate()
p.join()

完成,此外,start()函數(shù)也有清除僵尸進(jìn)程的功能。在使用多進(jìn)程處理任務(wù)時(shí)并非進(jìn)程越多越好,因?yàn)檫M(jìn)程切換會(huì)造成性能開銷。

3.線程與多線程

Python多線程依賴于標(biāo)準(zhǔn)庫threading,線程類Thread的常用方法如下表:

序號(hào)方法含義
1start()創(chuàng)建一個(gè)Thread子線程實(shí)例并執(zhí)行該實(shí)例的run()方法
2run()子線程需要執(zhí)行的目標(biāo)任務(wù)
3join()主進(jìn)程阻塞等待子線程直到子線程結(jié)束才繼續(xù)執(zhí)行,可以設(shè)置等待超時(shí)時(shí)間timeout
4is_alive()判斷子線程是否終止
5daemon設(shè)置子線程是否隨主進(jìn)程退出而退出

關(guān)于線程與進(jìn)程的關(guān)系,還有一個(gè)很生動(dòng)的例子

把一條公路看作一道進(jìn)程,那么公路上的各個(gè)車道就是進(jìn)程中的各個(gè)線程。這些線程(車道)共享了進(jìn)程(道路)的公共資源;這些線程(車道)之間可以并發(fā)執(zhí)行(各個(gè)車道相對(duì)獨(dú)立),也可以互相同步(交通信號(hào)燈)。

rsrc = 10
lock = threading.Lock()

def task1(name):
    global rsrc, lock
    for i in range(5):
        with lock:
            rsrc += 1
            print("task1:", rsrc)
    return name + "has been done!"

def task2(name):
    global rsrc, lock
    for i in range(5):
        lock.acquire()
        rsrc -= 1
        print("task2:", rsrc)
        lock.release() 
    return name + "has been done!"

結(jié)果如下

在多線程并發(fā)過程中,若沒有控制好線程間的執(zhí)行邏輯,將可能產(chǎn)生死鎖現(xiàn)象,可以使用with關(guān)鍵詞在線程訪問臨界區(qū)結(jié)束后自動(dòng)釋放鎖,也可使用release()方法手動(dòng)釋放句柄。

4.協(xié)程與多協(xié)程

協(xié)程適用于I/O密集型而非計(jì)算密集型場(chǎng)景。在協(xié)程發(fā)起I/O請(qǐng)求后返回結(jié)果前往往有大量閑置時(shí)間——該時(shí)間可能用于網(wǎng)絡(luò)數(shù)據(jù)傳輸、獲取協(xié)議頭、服務(wù)器查詢數(shù)據(jù)庫等,而I/O請(qǐng)求本身并不耗時(shí),因此協(xié)程可以發(fā)送一個(gè)請(qǐng)求后讓渡給系統(tǒng)干別的事,這就是協(xié)程提高性能的原因。

協(xié)程編程的框架如下:

  • 創(chuàng)建協(xié)程對(duì)象并將其封裝成任務(wù)實(shí)例;
  • 創(chuàng)建事件循環(huán)實(shí)例并監(jiān)聽任務(wù)隊(duì)列;
  • 獲取協(xié)程結(jié)果(可在事件循環(huán)結(jié)束后獲取,或提前添加回調(diào)函數(shù))。

一個(gè)嵌套協(xié)程的示例如下:

import asyncio, time

# 內(nèi)層協(xié)程
async def do_some_work(x):
    print('Waiting: ', x)
    await asyncio.sleep(x)
return 'Done after {}s'.format(x)

def OnCallBack(res):
print(res.result())

# 外層協(xié)程main
async def main():
    # 創(chuàng)建三個(gè)協(xié)程對(duì)象并封裝成任務(wù)
    task1 = asyncio.ensure_future(do_some_work(1))
    task2 = asyncio.ensure_future(do_some_work(8))
    task3 = asyncio.ensure_future(do_some_work(4))
    # 添加回調(diào)
    task1.add_done_callback(OnCallBack)
    task2.add_done_callback(OnCallBack)
    task3.add_done_callback(OnCallBack)
    # 內(nèi)層任務(wù)列表
    tasks = [task1, task2, task3]
	# 將列表轉(zhuǎn)為可等待對(duì)象
    dones, pendings = await asyncio.wait(tasks)

# 外層協(xié)程func
async def func():
    for i in range(5):
        print("func:", i)

# 外層任務(wù)列表
tasks = [asyncio.ensure_future(func()), asyncio.ensure_future(main())]
# 創(chuàng)建事件循環(huán)
loop = asyncio.get_event_loop()
start = time.time()
# 監(jiān)聽異步任務(wù)
loop.run_until_complete(asyncio.wait(tasks))
end = time.time()
print("總耗時(shí):", end - start)

5.總結(jié)

看了這么多概念可能有點(diǎn)暈了,下面這張表總結(jié)了本文的內(nèi)容??偟脕碚f,進(jìn)程、線程、協(xié)程各有各的應(yīng)用場(chǎng)景,不能說多進(jìn)程、多線程、多協(xié)程就一定好,而是要根據(jù)具體的使用情況來確定。

到此這篇關(guān)于一文搞懂Python中的進(jìn)程,線程和協(xié)程的文章就介紹到這了,更多相關(guān)Python進(jìn)程 線程 協(xié)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中怎樣查找文件當(dāng)前位置

    Python中怎樣查找文件當(dāng)前位置

    這篇文章主要介紹了Python中怎樣查找文件當(dāng)前位置的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python中動(dòng)態(tài)獲取對(duì)象的屬性和方法的教程

    Python中動(dòng)態(tài)獲取對(duì)象的屬性和方法的教程

    本文主要介紹了如何在Python中動(dòng)態(tài)獲取對(duì)象的屬性和方法,并運(yùn)行使用它們,需要的朋友可以參考一下
    2015-04-04
  • python opencv實(shí)現(xiàn)圖像邊緣檢測(cè)

    python opencv實(shí)現(xiàn)圖像邊緣檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了python opencv實(shí)現(xiàn)圖像邊緣檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Django model.py表單設(shè)置默認(rèn)值允許為空的操作

    Django model.py表單設(shè)置默認(rèn)值允許為空的操作

    這篇文章主要介紹了Django model.py表單設(shè)置默認(rèn)值允許為空的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • python修改全局變量可以不加global嗎?

    python修改全局變量可以不加global嗎?

    這篇文章主要探討的是python修改全局變量可不可以不加global,我們?cè)诰植孔饔糜騼?nèi)使用全局變量,需要使用global關(guān)鍵字進(jìn)行聲明,不然便不可用,但下面小編就和大家分享可以修改的數(shù)據(jù)類型在函數(shù)內(nèi)部做修改操作是不需要聲明global的商務(wù)情況,需要的朋友可以參考下
    2022-02-02
  • 十道Python面試最常問到的問題

    十道Python面試最常問到的問題

    這篇文章主要介紹了十道Python面試最常問到的問題,都是基礎(chǔ)的面試題,包括函數(shù),修飾器,數(shù)據(jù)結(jié)構(gòu)等,需要的朋友可以參考下
    2023-04-04
  • 通過Python實(shí)現(xiàn)對(duì)SQL Server 數(shù)據(jù)文件大小的監(jiān)控告警功能

    通過Python實(shí)現(xiàn)對(duì)SQL Server 數(shù)據(jù)文件大小的監(jiān)控告警功能

    這篇文章主要介紹了通過Python實(shí)現(xiàn)對(duì)SQL Server 數(shù)據(jù)文件大小的監(jiān)控告警,本文給大家分享問題報(bào)錯(cuò)信息及解決方案,需要的朋友可以參考下
    2021-04-04
  • Python3enumrate和range對(duì)比及示例詳解

    Python3enumrate和range對(duì)比及示例詳解

    這篇文章主要介紹了Python3enumrate和range對(duì)比及示例詳解,在Python中,enumrate和range都常用于for循環(huán)中,enumrate函數(shù)用于同時(shí)循環(huán)列表和元素,而range()函數(shù)可以生成數(shù)值范圍變化的列表,而能夠用于for循環(huán)即都是可迭代的,需要的朋友可以參考下
    2019-07-07
  • Python zip函數(shù)打包元素實(shí)例解析

    Python zip函數(shù)打包元素實(shí)例解析

    這篇文章主要介紹了Python zip函數(shù)打包元素實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python實(shí)現(xiàn)拉格朗日插值法的示例詳解

    Python實(shí)現(xiàn)拉格朗日插值法的示例詳解

    插值法是一種數(shù)學(xué)方法,用于在已知數(shù)據(jù)點(diǎn)(離散數(shù)據(jù))之間插入數(shù)據(jù),以生成連續(xù)的函數(shù)曲線,而格朗日插值法是一種多項(xiàng)式插值法。本文就來用Python實(shí)現(xiàn)拉格朗日插值法,希望對(duì)大家有所幫助
    2023-02-02

最新評(píng)論

新民市| 东至县| 抚远县| 凭祥市| 邹平县| 呼伦贝尔市| 昂仁县| 宜城市| 新和县| 宜宾市| 高安市| 梓潼县| 洛扎县| 唐海县| 治多县| 尚志市| 图们市| 湛江市| 扶绥县| 漳浦县| 双辽市| 北川| 海安县| 长丰县| 临沂市| 婺源县| 土默特右旗| 田林县| 万年县| 铜川市| 阳东县| 高清| 丹凤县| 铜梁县| 神农架林区| 阿巴嘎旗| 永平县| 汉寿县| 张掖市| 连城县| 广安市|