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

詳解Python中的進(jìn)程和線程

 更新時間:2021年06月23日 14:56:21   作者:Huny  
今天帶大家學(xué)習(xí)的是關(guān)于Python的相關(guān)知識,文章圍繞著Python中的進(jìn)程和線程展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下

進(jìn)程是什么?

進(jìn)程就是一個程序在一個數(shù)據(jù)集上的一次動態(tài)執(zhí)行過程。進(jìn)程一般由程序、數(shù)據(jù)集、進(jìn)程控制塊三部分組成。我們編寫的程序用來描述進(jìn)程要完成哪些功能以及如何完成;數(shù)據(jù)集則是程序在執(zhí)行過程中所需要使用的資源;進(jìn)程控制塊用來記錄進(jìn)程的外部特征,描述進(jìn)程的執(zhí)行變化過程,系統(tǒng)可以利用它來控制和管理進(jìn)程,它是系統(tǒng)感知進(jìn)程存在的唯一標(biāo)志。

線程是什么?

線程也叫輕量級進(jìn)程,它是一個基本的CPU執(zhí)行單元,也是程序執(zhí)行過程中的最小單元,由線程ID、程序計數(shù)器、寄存器集合和堆棧共同組成。線程的引入減小了程序并發(fā)執(zhí)行時的開銷,提高了操作系統(tǒng)的并發(fā)性能。線程沒有自己的系統(tǒng)資源。

進(jìn)程和線程的區(qū)別

進(jìn)程是計算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)?;蛘哒f進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運(yùn)行活動,進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨(dú)立單位。
線程則是進(jìn)程的一個實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位。

進(jìn)程和線程的關(guān)系:

(1)一個線程只能屬于一個進(jìn)程,而一個進(jìn)程可以有多個線程,但至少有一個線程。
(2)資源分配給進(jìn)程,同一進(jìn)程的所有線程共享該進(jìn)程的所有資源。
(3)CPU分給線程,即真正在CPU上運(yùn)行的是線程。

并行和并發(fā)

并行處理(Parallel Processing)是計算機(jī)系統(tǒng)中能同時執(zhí)行兩個或者更多個處理的一種計算方法。并行處理可同時工作于同一程序的不同方面,并行處理的主要目的是節(jié)省大型和復(fù)雜問題的解決時間。

并發(fā)處理(concurrency Processing)是指一個時間段中有幾個程序都處于已經(jīng)啟動運(yùn)行到運(yùn)行完畢之間,而且這幾個程序都是在同一處理機(jī)(CPU)上運(yùn)行,但任意時刻點(diǎn)上只有一個程序在處理機(jī)(CPU)上運(yùn)行

同步和異步

同步就是指一個進(jìn)程在執(zhí)行某個請求的時候,若該請求需要一段時間才能返回信息,那么這個進(jìn)程將會一直等待下去,直到收到返回信息才繼續(xù)執(zhí)行下去;
異步是指進(jìn)程不需要一直等下去,而是繼續(xù)執(zhí)行下面的操作,不管其他進(jìn)程的狀態(tài)。當(dāng)有消息返回時系統(tǒng)會通知進(jìn)程進(jìn)行處理,這樣可以提高執(zhí)行的效率。
舉個例子,打電話時就是同步通信,發(fā)短息時就是異步通信。

單例執(zhí)行

from random import randint
from time import time, sleep


def download_task(filename):
    print('開始下載%s...' % filename)
    time_to_download = randint(5, 10)
    sleep(time_to_download)
    print('%s下載完成! 耗費(fèi)了%d秒' % (filename, time_to_download))


def main():
    start = time()
    download_task('Python入門.pdf')
    download_task('av.avi')
    end = time()
    print('總共耗費(fèi)了%.2f秒.' % (end - start))


if __name__ == '__main__':
    main()

運(yùn)行是順序執(zhí)行,所以耗時是多個進(jìn)程的時間總和

因?yàn)槭菃芜M(jìn)程任務(wù),所有任務(wù)都是排隊(duì)進(jìn)行所以這樣執(zhí)行效率非常的低。我們來添加多進(jìn)程模式進(jìn)行多進(jìn)程同時執(zhí)行,這樣一個進(jìn)程執(zhí)行時,另一個進(jìn)程無需等待,執(zhí)行時間將大大縮短。

多進(jìn)程

from random import randint
from time import time, sleep
from multiprocessing import Process
from os import getpid


def download_task(filename):
    print('啟動下載進(jìn)程,進(jìn)程號:[%d]'%getpid())
    print('開始下載%s...' % filename)
    time_to_download = randint(5, 10)
    sleep(time_to_download)
    print('%s下載完成! 耗費(fèi)了%d秒' % (filename, time_to_download))


def main():
    start = time()
    p1 = Process(target=download_task,args=('python入門.pdf',))
    p2 = Process(target=download_task,args=('av.avi',))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    # download_task('Python入門.pdf')
    # download_task('av.avi')
    end = time()
    print('總共耗費(fèi)了%.2f秒.' % (end - start))


if __name__ == '__main__':
    main()

多個進(jìn)程并排執(zhí)行,總耗時就是最長耗時的那個進(jìn)程的時間。

大致的執(zhí)行流程如下圖

多進(jìn)程的特點(diǎn)是相互獨(dú)立,不會共享全局變量,即在一個進(jìn)程中對全局變量修改過后,不會影響另一個進(jìn)程中的全局變量。

進(jìn)程間通信

from random import randint
from time import time,sleep
from multiprocessing import Process
from os import getpid

time_to_download = 3
def download_task(filename):
    global time_to_download
    time_to_download += 1
    print('啟動下載進(jìn)程,進(jìn)程號:[%d]'%getpid())
    print('開始下載%s...' % filename)
    sleep(time_to_download)
    print('%s下載完成! 耗費(fèi)了%d秒' % (filename, time_to_download))

def download_task2(filename):
    global time_to_download
    print('啟動下載進(jìn)程,進(jìn)程號:[%d]'%getpid())
    print('開始下載%s...' % filename)
    sleep(time_to_download)
    print('%s下載完成! 耗費(fèi)了%d秒' % (filename, time_to_download))

def main():
    start = time()
    p1 = Process(target=download_task,args=('python入門.pdf',))
    p2 = Process(target=download_task2,args=('av.avi',))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    end = time()
    print('總共耗費(fèi)了%.2f秒.' % (end - start))


if __name__ == '__main__':
    main()

從執(zhí)行結(jié)果可以看出,兩個進(jìn)程間的全局變量無法共享,所以它們是相互獨(dú)立的

當(dāng)然多進(jìn)程也是可以進(jìn)行通過一些方法進(jìn)行數(shù)據(jù)共享的??梢允褂胢ultiprocessing模塊的Queue實(shí)現(xiàn)多進(jìn)程之間的數(shù)據(jù)傳遞,Queue本身是一個消息列隊(duì)程序。

這里介紹Queue的常用進(jìn)程通信的兩種方法:
put 方法用以插入數(shù)據(jù)到隊(duì)列中, put 方法還有兩個可選參數(shù): blocked 和 timeout。如果 blocked 為 True(默認(rèn)值),并且 timeout 為正值,該方法會阻塞 timeout 指定的時間,直到該隊(duì)列有剩余的空間。如果超時,會拋出 Queue.full 異常。如果 blocked 為 False,但該 Queue 已滿,會立即拋出 Queue.full 異常。

get 方法可以從隊(duì)列讀取并且刪除一個元素。同樣, get 方法有兩個可選參數(shù): blocked和 timeout。如果 blocked 為 True(默認(rèn)值),并且 timeout 為正值,那么在等待時間內(nèi)沒有取到任何元素,會拋出 Queue.Empty 異常。如果 blocked 為 False,有兩種情況存在,如果Queue 有一個值可用,則立即返回該值,否則,如果隊(duì)列為空,則立即拋出Queue.Empty 異常。

Queue 隊(duì)列實(shí)現(xiàn)進(jìn)程間通信

from random import randint
from time import time,sleep
from multiprocessing import Process
import multiprocessing
from os import getpid

time_to_download = 3
def write(q):
    for i in ['python入門','av.avi','java入門']:
        q.put(i)
        print('啟動寫入進(jìn)程,進(jìn)程號:[%d]'%getpid())
        print('開始寫入%s...' % i)  
        sleep(time_to_download)

def read(q):
    while True:
        if not q.empty():
            print('啟動讀取進(jìn)程,進(jìn)程號:[%d]'%getpid())
            print('開始讀取%s...' % q.get())
            sleep(time_to_download)
        else:
            break

def main():
    q = multiprocessing.Queue()
    p1 = Process(target=write,args=(q,))
    p2 = Process(target=read,args=(q,))
    p1.start()
    p1.join()
    p2.start()
    p2.join()


if __name__ == '__main__':
    main()

上一個進(jìn)程寫入的數(shù)據(jù)通過Queue隊(duì)列共享給了下一個進(jìn)程,然后下一個進(jìn)程可以直接進(jìn)行使用,這樣就完成了多進(jìn)程間的數(shù)據(jù)共享。

進(jìn)程池

Pool類可以提供指定數(shù)量的進(jìn)程供用戶調(diào)用,當(dāng)有新的請求提交到Pool中時,如果池還沒有滿,就會創(chuàng)建一個新的進(jìn)程來執(zhí)行請求。如果池滿,請求就會告知先等待,直到池中有進(jìn)程結(jié)束,才會創(chuàng)建新的進(jìn)程來執(zhí)行這些請求。
進(jìn)程池中常見三個方法:

◆apply:串行
◆apply_async:并行
◆map

多線程

from random import randint
from time import time, sleep
from threading import Thread
from os import getpid

def download_task(filename):
    print('啟動下載進(jìn)程,進(jìn)程號:[%d]' % getpid())
    print('開始下載%s...' % filename)
    time_to_download = randint(5, 10)
    sleep(time_to_download)
    print('%s下載完成! 耗費(fèi)了%d秒' % (filename, time_to_download))

def main():
    start = time()
    p1 = Thread(target=download_task, args=('python入門.pdf',))
    p2 = Thread(target=download_task, args=('av.avi',))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    end = time()
    print('總共耗費(fèi)了%.2f秒.' % (end - start))

if __name__ == '__main__':
    main()

多線程執(zhí)行因?yàn)镚IL鎖的存在,實(shí)際上執(zhí)行是進(jìn)行單線程,即一次只執(zhí)行一個線程,然后在切換其他的線程進(jìn)行執(zhí)行,因?yàn)槠渲星袚Q的時間非常的短,所以看上去依然像是多線程一起執(zhí)行。

通過繼承Thread類的方式來創(chuàng)建自定義的線程類,然后再創(chuàng)建線程對象并啟動線程

from random import randint
from threading import Thread
from time import time, sleep

class DownloadTask(Thread):
    def __init__(self, filename):
        super().__init__()
        self._filename = filename

    def run(self):
        print('開始下載%s...'% self._filename)
        time_to_download = randint(5,10)
        sleep(time_to_download)
        print('%s下載完成!耗費(fèi)了%d秒' %(self._filename, time_to_download))

def main():
    start = time()
    t1 = DownloadTask('python入門')
    t2 = DownloadTask('av.avi')
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    end = time()
    print('共耗費(fèi)了%.2f秒'%(end - start))

if __name__ == '__main__':
    main()

多線程使用類還是函數(shù)執(zhí)行的結(jié)果完全一致,具體怎么使用可以結(jié)合自己的使用場景。

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

相關(guān)文章

  • TensorFlow模型保存/載入的兩種方法

    TensorFlow模型保存/載入的兩種方法

    這篇文章主要為大家詳細(xì)介紹了TensorFlow 模型保存/載入的兩種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Pycharm2020.1安裝無法啟動問題即設(shè)置中文插件的方法

    Pycharm2020.1安裝無法啟動問題即設(shè)置中文插件的方法

    這篇文章主要介紹了Pycharm2020.1安裝無法啟動問題即設(shè)置中文插件的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-08-08
  • Python視頻剪輯Moviepy庫使用教程

    Python視頻剪輯Moviepy庫使用教程

    這篇文章主要為大家介紹了Python視頻剪輯Moviepy庫使用教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Windows64x下VScode下載過程

    Windows64x下VScode下載過程

    這篇文章主要介紹了Windows64x下VScode下載,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • Python可視化神器pyecharts繪制漏斗圖

    Python可視化神器pyecharts繪制漏斗圖

    這篇文章主要介紹了Python可視化神器pyecharts繪制漏斗圖,漏斗圖是由Light等在1984年提出,一般以單個研究的效應(yīng)量為橫坐標(biāo),樣本含量為縱坐標(biāo)做的散點(diǎn)圖
    2022-07-07
  • 深入Python函數(shù)編程的一些特性

    深入Python函數(shù)編程的一些特性

    這篇文章主要介紹了更為深入的Python函數(shù)編程的一些特性,本文來自于IBM官方開發(fā)者技術(shù)文檔,需要的朋友可以參考下
    2015-04-04
  • GDAL 矢量屬性數(shù)據(jù)修改方式(python)

    GDAL 矢量屬性數(shù)據(jù)修改方式(python)

    這篇文章主要介紹了GDAL 矢量屬性數(shù)據(jù)修改方式(python),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Python中順序結(jié)構(gòu)和循環(huán)結(jié)構(gòu)示例代碼

    Python中順序結(jié)構(gòu)和循環(huán)結(jié)構(gòu)示例代碼

    這篇文章主要介紹了Python中的條件語句和循環(huán)語句,條件語句用于根據(jù)條件執(zhí)行不同的代碼塊,循環(huán)語句用于重復(fù)執(zhí)行一段代碼,文章還詳細(xì)說明了range函數(shù)的使用和continue與break語句的作用,需要的朋友可以參考下
    2025-02-02
  • 思考分析Python運(yùn)算中?a+=b?和?a=a+b是否相等

    思考分析Python運(yùn)算中?a+=b?和?a=a+b是否相等

    這篇文章主要為大家介紹了Python運(yùn)算中a+=b和a=a+b是否相等及原理思考分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • pytorch中Parameter函數(shù)用法示例

    pytorch中Parameter函數(shù)用法示例

    這篇文章主要為大家介紹了pytorch中Parameter函數(shù)用法,并用詳細(xì)的代碼示例進(jìn)行演示詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-01-01

最新評論

长治县| 连云港市| 长治县| 新乐市| 雅江县| 克什克腾旗| 福贡县| 辉县市| 申扎县| 乌拉特前旗| 筠连县| 丹东市| 于都县| 昌乐县| 白玉县| 新龙县| 海原县| 花莲县| 泰和县| 东平县| 微山县| 金湖县| 辉县市| 铁岭市| 嘉鱼县| 祁阳县| 杭锦后旗| 棋牌| 邮箱| 桂阳县| 安陆市| 扎赉特旗| 延安市| 三门峡市| 鹰潭市| 重庆市| 阿坝| 甘孜| 平江县| 台东县| 柳河县|