婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解Python中的進程和線程

詳解Python中的進程和線程

熱門標簽:百度地圖標注位置怎么修改 高德地圖標注是免費的嗎 大連crm外呼系統 北京電信外呼系統靠譜嗎 老人電話機器人 梅州外呼業務系統 地圖標注視頻廣告 無錫客服外呼系統一般多少錢 洪澤縣地圖標注

進程是什么?

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

線程是什么?

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

進程和線程的區別

進程是計算機中的程序關于某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。或者說進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。
線程則是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。

進程和線程的關系:

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

并行和并發

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

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

同步和異步

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

單例執行

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下載完成! 耗費了%d秒' % (filename, time_to_download))


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


if __name__ == '__main__':
    main()

運行是順序執行,所以耗時是多個進程的時間總和

因為是單進程任務,所有任務都是排隊進行所以這樣執行效率非常的低。我們來添加多進程模式進行多進程同時執行,這樣一個進程執行時,另一個進程無需等待,執行時間將大大縮短。

多進程

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


def download_task(filename):
    print('啟動下載進程,進程號:[%d]'%getpid())
    print('開始下載%s...' % filename)
    time_to_download = randint(5, 10)
    sleep(time_to_download)
    print('%s下載完成! 耗費了%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('總共耗費了%.2f秒.' % (end - start))


if __name__ == '__main__':
    main()

多個進程并排執行,總耗時就是最長耗時的那個進程的時間。

大致的執行流程如下圖

多進程的特點是相互獨立,不會共享全局變量,即在一個進程中對全局變量修改過后,不會影響另一個進程中的全局變量。

進程間通信

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('啟動下載進程,進程號:[%d]'%getpid())
    print('開始下載%s...' % filename)
    sleep(time_to_download)
    print('%s下載完成! 耗費了%d秒' % (filename, time_to_download))

def download_task2(filename):
    global time_to_download
    print('啟動下載進程,進程號:[%d]'%getpid())
    print('開始下載%s...' % filename)
    sleep(time_to_download)
    print('%s下載完成! 耗費了%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('總共耗費了%.2f秒.' % (end - start))


if __name__ == '__main__':
    main()

從執行結果可以看出,兩個進程間的全局變量無法共享,所以它們是相互獨立的

當然多進程也是可以進行通過一些方法進行數據共享的。可以使用multiprocessing模塊的Queue實現多進程之間的數據傳遞,Queue本身是一個消息列隊程序。

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

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

Queue 隊列實現進程間通信

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('啟動寫入進程,進程號:[%d]'%getpid())
        print('開始寫入%s...' % i)  
        sleep(time_to_download)

def read(q):
    while True:
        if not q.empty():
            print('啟動讀取進程,進程號:[%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()

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

進程池

Pool類可以提供指定數量的進程供用戶調用,當有新的請求提交到Pool中時,如果池還沒有滿,就會創建一個新的進程來執行請求。如果池滿,請求就會告知先等待,直到池中有進程結束,才會創建新的進程來執行這些請求。
進程池中常見三個方法:

◆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('啟動下載進程,進程號:[%d]' % getpid())
    print('開始下載%s...' % filename)
    time_to_download = randint(5, 10)
    sleep(time_to_download)
    print('%s下載完成! 耗費了%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('總共耗費了%.2f秒.' % (end - start))

if __name__ == '__main__':
    main()

多線程執行因為GIL鎖的存在,實際上執行是進行單線程,即一次只執行一個線程,然后在切換其他的線程進行執行,因為其中切換的時間非常的短,所以看上去依然像是多線程一起執行。

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

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下載完成!耗費了%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('共耗費了%.2f秒'%(end - start))

if __name__ == '__main__':
    main()

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

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

您可能感興趣的文章:
  • Python多線程與多進程相關知識總結
  • Python多進程與多線程的使用場景詳解
  • Python之多進程與多線程的使用
  • Python 多進程、多線程效率對比
  • python中線程和進程有何區別
  • python 在threading中如何處理主進程和子線程的關系
  • Python隊列、進程間通信、線程案例

標簽:洛陽 泉州 安慶 清遠 長春 怒江 岳陽 吉林

巨人網絡通訊聲明:本文標題《詳解Python中的進程和線程》,本文關鍵詞  詳解,Python,中的,進程,和,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解Python中的進程和線程》相關的同類信息!
  • 本頁收集關于詳解Python中的進程和線程的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    中文字幕免费观看一区| 欧美韩国日本一区| 欧美精品精品一区| 久久久久97国产精华液好用吗| 成人欧美一区二区三区小说| 亚洲一区二区在线观看视频| 国产乱码精品一区二区三 | 久久免费电影网| 亚洲成人动漫精品| 午夜婷婷国产麻豆精品| 国产大陆亚洲精品国产| 日韩欧美国产一二三区| 亚洲第一久久影院| 欧美日韩亚州综合| 午夜视频一区在线观看| 国产一区二区在线影院| 精品国产乱码久久久久久1区2区 | 国产日韩欧美精品综合| 中文字幕高清不卡| 国产成人免费9x9x人网站视频| 欧美三级在线视频| 日本vs亚洲vs韩国一区三区二区| 欧美高清激情brazzers| 亚洲chinese男男1069| 国产suv一区二区三区88区| 国产欧美日韩在线| 亚洲成a人v欧美综合天堂| 成人精品免费网站| 亚洲图片你懂的| 欧美性极品少妇| 午夜激情久久久| 日韩欧美一区中文| 天堂在线一区二区| 久久久久青草大香线综合精品| 国产精品羞羞答答xxdd| 国产精品国产精品国产专区不蜜| 在线观看网站黄不卡| 亚洲精品自拍动漫在线| 成人激情小说乱人伦| 中文字幕一区二区三区在线观看 | 国产毛片精品视频| 亚洲国产精品黑人久久久| 国产一区二区三区蝌蚪| 亚洲同性同志一二三专区| 欧美人体做爰大胆视频| 国产精品资源在线| 一区二区三区免费观看| 日韩一卡二卡三卡四卡| 成人小视频在线观看| 亚洲成人一二三| 久久久精品影视| 欧美性大战久久久久久久| 日一区二区三区| 欧美一区二区三区思思人| 久久精品99久久久| 亚洲精品欧美二区三区中文字幕| 欧美一区二区三区在线看| va亚洲va日韩不卡在线观看| 日韩av电影免费观看高清完整版 | 色综合久久久久网| 久久99热狠狠色一区二区| 欧美大片在线观看一区二区| 91久久精品国产91性色tv| 国产精品一区二区无线| 亚洲精品国产品国语在线app| 精品国产乱码久久久久久牛牛| 欧美视频在线一区二区三区| 国产aⅴ综合色| 美国欧美日韩国产在线播放| 亚洲午夜精品在线| 日韩欧美aaaaaa| 欧美日本不卡视频| 色成人在线视频| 99久久久国产精品免费蜜臀| 国产尤物一区二区在线| 视频在线在亚洲| 国产日本亚洲高清| 2019国产精品| 国产精品77777| 亚洲色图色小说| 国产精品美女www爽爽爽| 精品电影一区二区| 欧美成人性战久久| 91精品黄色片免费大全| 在线观看免费一区| 精品亚洲欧美一区| 国产一区二区三区精品视频| 久久精品久久99精品久久| 五月天久久比比资源色| 国产日韩欧美精品在线| 欧美日韩电影在线| 欧美电影影音先锋| 91精品国产aⅴ一区二区| 4438x成人网最大色成网站| 欧美日韩国产在线观看| 欧美日韩综合色| 91麻豆精品国产91| 色综合久久中文综合久久牛| 97精品国产露脸对白| 99免费精品在线| 色婷婷激情一区二区三区| 日本乱人伦aⅴ精品| 欧美在线视频全部完| 欧美精品乱码久久久久久| 欧美一级片在线| 欧美挠脚心视频网站| 国产激情一区二区三区| 国产精品 欧美精品| 99精品一区二区| 欧美日韩夫妻久久| 久久婷婷综合激情| 成人免费在线观看入口| 午夜视黄欧洲亚洲| 九一久久久久久| 成人aaaa免费全部观看| 精品视频在线视频| 日韩三级精品电影久久久| 欧美日韩中文国产| www激情久久| 一区二区免费在线| 国模无码大尺度一区二区三区| 国产91精品久久久久久久网曝门| 欧美电影免费观看高清完整版在线| 日韩欧美国产午夜精品| 中文字幕精品一区| 视频在线观看一区二区三区| 成人一级片在线观看| 国产精品一区在线观看乱码| 激情五月激情综合网| 99久久国产综合精品麻豆| 欧美人与性动xxxx| 国产精品久久久久久久久免费桃花| 首页综合国产亚洲丝袜| 丁香桃色午夜亚洲一区二区三区| 欧美性一级生活| 国产精品女同一区二区三区| 免费精品视频在线| 激情国产一区二区| 国产aⅴ综合色| 日韩一区二区电影在线| 亚洲欧美国产高清| 精品一二三四区| 欧美片网站yy| 亚洲激情图片一区| 成人av资源在线| 久久综合狠狠综合久久综合88| 偷拍与自拍一区| 欧洲av一区二区嗯嗯嗯啊| 欧美日韩激情一区二区三区| 亚洲精品国产品国语在线app| 国产成人精品亚洲777人妖| 日韩一级高清毛片| 亚洲香肠在线观看| 91网站在线播放| 亚洲欧洲另类国产综合| 91丝袜美女网| 石原莉奈在线亚洲三区| 欧美一区二区三区喷汁尤物| 国产在线精品国自产拍免费| 国产精品嫩草影院com| 91国偷自产一区二区三区成为亚洲经典| 亚洲国产另类av| 精品国产一区二区精华| 成人午夜免费视频| 一区二区三区色| 精品国产麻豆免费人成网站| aaa亚洲精品一二三区| 日韩精品色哟哟| 中文字幕一区二区5566日韩| 91精品国产全国免费观看| 国产激情偷乱视频一区二区三区| 亚洲免费观看视频| 精品久久五月天| 欧美主播一区二区三区| 国产成人午夜视频| 香蕉乱码成人久久天堂爱免费| 久久久不卡网国产精品二区| 91免费版pro下载短视频| 极品瑜伽女神91| 亚洲国产日韩一区二区| 国产无一区二区| 欧美丰满一区二区免费视频| 成人av在线电影| 精品午夜久久福利影院| 亚洲国产欧美日韩另类综合| 中文字幕av免费专区久久| 91精品国产色综合久久不卡电影| 99久久精品免费看国产| 国产精品一区二区91| 日日摸夜夜添夜夜添精品视频| 亚洲婷婷国产精品电影人久久| 2020日本不卡一区二区视频| 欧美精品久久一区二区三区| 99精品视频一区二区| 国产成人精品免费网站| 老司机精品视频在线| 日韩中文字幕不卡| 亚洲国产中文字幕| 亚洲蜜臀av乱码久久精品| 国产精品免费看片|