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

python教程之進(jìn)程和線程

 更新時間:2022年01月13日 15:03:37   作者:虛幻私塾  
這篇文章主要為大家介紹了python進(jìn)程和線程,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

進(jìn)程和線程的區(qū)別和聯(lián)系

終于開始加深難度,來到進(jìn)程和線程的知識點(diǎn)~

單就這兩個概念,就難倒過不少初學(xué)者——今天學(xué)了概念,明天就忘記;明天學(xué)了例子,又忘記了概念。

要理解進(jìn)程和線程的聯(lián)系和區(qū)別,我舉個特簡單的例子:

你的電腦有兩個瀏覽器,一個谷歌瀏覽器,一個qq瀏覽器。

一個瀏覽器就是一個進(jìn)程。

然后,你打開了谷歌瀏覽器,百度搜索了測試奇譚,又新開一個標(biāo)簽頁,打開譚叔的文章,如下圖所示:

image-20210404220106555

你可以這樣理解——在同一個瀏覽器打開的兩個網(wǎng)頁就是兩個線程。如果我關(guān)閉了瀏覽器,這兩個線程也沒有了。

好了,當(dāng)你有了概念后,我才好講兩者的區(qū)別和聯(lián)系。

進(jìn)程

  • 優(yōu)點(diǎn)
    • 穩(wěn)定性高,當(dāng)程序崩潰后,不影響其他進(jìn)程的使用。即谷歌瀏覽器崩潰后,qq瀏覽器還可以正常使用。
  • 缺點(diǎn)
    • 創(chuàng)建進(jìn)程的代價大。即當(dāng)你開了各種各樣的瀏覽器后,你的電腦會特別卡,因為電腦內(nèi)存和CPU有上限。

線程

  • 優(yōu)點(diǎn)
    • 多線程通常比多進(jìn)程快一點(diǎn),但優(yōu)勢不大
  • 缺點(diǎn)
    • 任何一個線程掛掉會造成整個進(jìn)程崩潰,因為線程共享進(jìn)程的內(nèi)存(瀏覽器的例子不再適用,可以理解為綁在一條船上的螞蚱)

多進(jìn)程

因為大多數(shù)小伙伴用的Windows操作系統(tǒng),所以針對Unix/Linux的fork()調(diào)用拋開不談。

在python,一般使用multiprocessing實現(xiàn)多進(jìn)程。

import os
from multiprocessing import Process
def run\_proc(name):
    print('開始執(zhí)行子進(jìn)程 %s (%s)…' % (name, os.getpid()))
# 子進(jìn)程要執(zhí)行的代碼
if __name__ == '\_\_main\_\_':
    print('父進(jìn)程 %s.' % os.getpid())
    p = Process(target=run_proc, args=('test',)) # 創(chuàng)建一個Process實例
    print('子進(jìn)程即將開始.')
    p.start()  # 用start()方法啟動實例
    p.join()   # join()方法可以等待子進(jìn)程結(jié)束后再繼續(xù)往下運(yùn)行,通常用于進(jìn)程間的同步
    print('子進(jìn)程結(jié)束.')

要細(xì)講嗎?

其實,我的備注寫得很全,你只需copy代碼下來執(zhí)行一次,或者debug一次,就能明白。

線程池

如何理解?

即代碼可運(yùn)行的進(jìn)程數(shù)量,有個地方管控它。

from multiprocessing import Pool
import os
import time
import random
def long\_time\_task(name):
    print('開始 task %s (%s)...' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print('Task %s 執(zhí)行花費(fèi) %0.2f 秒.' % (name, (end - start)))
if __name__ == '\_\_main\_\_':
    print('父親進(jìn)程 %s.' % os.getpid())
    p = Pool(3)
    # 因為Pool的默認(rèn)大小是4,故task 0,1,2,3是立刻執(zhí)行的,而task 4要等待前面某個task完成后才執(zhí)行,但最多同時執(zhí)行4個進(jìn)程
    # 由于Pool的默認(rèn)大小是CPU的核數(shù),如果你擁有8核CPU,要提交至少9個子進(jìn)程才能看到等待效果
    for i in range(5):
        p.apply_async(long_time_task, args=(i,))
    print('等待子進(jìn)程結(jié)束...')
    p.close()
    # 對Pool對象調(diào)用join()方法會等待所有子進(jìn)程執(zhí)行完畢
    # 調(diào)用join()之前必須先調(diào)用close(),調(diào)用close()之后就不能繼續(xù)添加新的Process了
    p.join()
    print('所有子進(jìn)程已執(zhí)行.')

以上,是必知必會的。

當(dāng)然,最好的學(xué)習(xí)時機(jī)是:當(dāng)你要用時,再來復(fù)盤學(xué),效果最佳。

如果你學(xué)了,沒有使用場景,我建議緩一緩學(xué)或者作為知識儲備。

多線程

多線程有三點(diǎn)必須提前明確:

  • 多任務(wù)需求可以由多進(jìn)程完成,也可以由一個進(jìn)程內(nèi)的多線程完成
  • 進(jìn)程是由若干線程組成
  • 一個進(jìn)程至少有一個線程

Python的標(biāo)準(zhǔn)庫提供了兩個模塊:_thread和threading,_thread是低級模塊,我們一般使用高級模塊threading(對_thread進(jìn)行過封裝)。

啟動一個線程就是把一個函數(shù)傳入并創(chuàng)建Thread實例,然后調(diào)用start()開始執(zhí)行,我們看一個簡單的例子:

import time
import threading
# 新線程執(zhí)行的代碼
def loop():
    # 由于任何進(jìn)程默認(rèn)就會啟動一個線程,我們把該線程稱為主線程,主線程又可以啟動新的線程,
    # Python的threading模塊有個current\_thread()函數(shù),它永遠(yuǎn)返回當(dāng)前線程的實例
    print('線程ss %s 運(yùn)行中…' % threading.current_thread().name)
    n = 0
    # 主線程實例的名字叫MainThread,子線程的名字在創(chuàng)建時指定,我們用LoopThread命名子線程,在打印輸出的時候顯示名字
    while n < 5:
    n = n + 1
    print('線程ss %s >>> %s' % (threading.current_thread().name, n))
    time.sleep(1)
print('線程ss %s 已結(jié)束.' % threading.current_thread().name)
print('線程 %s is 運(yùn)行中…' % threading.current_thread().name)
t = threading.Thread(target=loop, name='LoopThread')
t.start()
t.join()
'''
對于 join()方法而言,其另一個重要方面是其實它根本不需要調(diào)用。
一旦線程啟動,它們 就會一直執(zhí)行,直到給定的函數(shù)完成后退出。
如果主線程還有其他事情要去做,而不是等待這些線程完成(例如其他處理或者等待新的客戶端請求),
就可以不調(diào)用 join()。join()方法只有在你需要等待線程完成的時候才是有用的
'''
print('線程 %s 已結(jié)束.' % threading.current_thread().name)

同樣,以上內(nèi)容,是必知必會的。

并且,工作場景,我們一般會使用多線程處理問題,而非多進(jìn)程。(注意:是一般)

至于進(jìn)程間通信、線程鎖、GIL鎖、多線程變量、線程間通信、異步協(xié)程等知識,講起來比較復(fù)雜,也不是極簡教程的核心,你可以先自學(xué),或者當(dāng)你真正要使用它的時候再去看,再去學(xué)。

總結(jié)

01 多線程、多進(jìn)程,是必知必會的;

02 學(xué)習(xí)進(jìn)度自己琢磨,既不能死磕,亦不能簡單跳過;

03 小伙伴比較關(guān)心,面試時會不會被問到。答:一般公司不會,so?

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

最新評論

织金县| 顺平县| 许昌县| 蓬莱市| 堆龙德庆县| 七台河市| 运城市| 锡林郭勒盟| 龙川县| 台江县| 思茅市| 朔州市| 阿瓦提县| 泾川县| 阳东县| 武宁县| 当涂县| 桓仁| 三穗县| 嫩江县| 黄骅市| 岚皋县| 中方县| 怀仁县| 上林县| 外汇| 上林县| 阳原县| 京山县| 兴仁县| 高邑县| 张家港市| 乐山市| 石阡县| 西和县| 南召县| 鄂州市| 东兰县| 手机| 怀来县| 石景山区|