" />

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

Python多線程編程入門詳解

 更新時(shí)間:2021年12月06日 15:52:21   作者:軟件開發(fā)技術(shù)愛好者  
這篇文章主要為大家介紹了Python多線程編程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

一、任務(wù)、進(jìn)程和線程

現(xiàn)代操作系統(tǒng)比如Mac OS XLinux,Windows等,都是支持“多任務(wù)”的操作系統(tǒng)。

什么叫“多任務(wù)”(multitasking)呢?簡(jiǎn)單地說,就是操作系統(tǒng)可以同時(shí)運(yùn)行多個(gè)任務(wù)。例如你一邊在用瀏覽器上查資料,一邊在聽MP3,一邊在用Word寫文檔,這就是多任務(wù)。

打開Windows的任務(wù)管理器,可以直觀的了解一下:

任務(wù)

(task)是最抽象的,是一個(gè)一般性的術(shù)語(yǔ),指由軟件完成的一個(gè)活動(dòng)。一個(gè)任務(wù)既可以是一個(gè)進(jìn)程,也可以是一個(gè)線程。簡(jiǎn)而言之,它指的是一系列共同達(dá)到某一目的的操作。例如,讀取數(shù)據(jù)并將數(shù)據(jù)放入內(nèi)存中。這個(gè)任務(wù)可以作為一個(gè)進(jìn)程來實(shí)現(xiàn),也可以作為一個(gè)線程(或作為一個(gè)中斷任務(wù))來實(shí)現(xiàn)。

單核CPU如何實(shí)現(xiàn)“多任務(wù)”

三個(gè)任務(wù)A,B,C在單個(gè)CPU上交替執(zhí)行,邏輯上表現(xiàn)為三個(gè)執(zhí)行實(shí)例并發(fā)執(zhí)行,但實(shí)質(zhì)物理上是串行執(zhí)行。

多核CPU如何實(shí)現(xiàn)“多任務(wù)”

多任務(wù)的真正并行只能在多核CPU上實(shí)現(xiàn),但是,一般而言,任務(wù)的數(shù)量多于CPU的核數(shù),還是需要將多個(gè)任務(wù)輪流調(diào)度到每個(gè)核上執(zhí)行。

單核與多核處理器(Multi-core processor)示例

多核CPU:簡(jiǎn)單地說是將多個(gè)核心裝載一個(gè)封裝里,外觀上看是一個(gè)處理器。

串行:一個(gè)處理完再一個(gè)。

并行:指兩個(gè)或者多個(gè)事件在同一時(shí)刻發(fā)生。

并發(fā):指兩個(gè)或多個(gè)事件在同一時(shí)間間隔內(nèi)發(fā)生。

例如:并發(fā)時(shí)你正在吃飯,吃到一半電話響,去接電話,接完后繼續(xù)吃飯;并行時(shí)邊吃飯邊打電話。

進(jìn)程

(process)常常被定義為程序的執(zhí)行。可以把一個(gè)進(jìn)程看成是一個(gè)獨(dú)立的程序,在內(nèi)存中有其完備的數(shù)據(jù)空間和代碼空間。一個(gè)進(jìn)程所擁有的數(shù)據(jù)和變量只屬于它自己。

線程

(tread)則是某一進(jìn)程中一路單獨(dú)運(yùn)行的程序。也就是說,線程存在于進(jìn)程之中。一個(gè)進(jìn)程由一個(gè)或多個(gè)線程構(gòu)成,各線程共享相同的代碼和全局?jǐn)?shù)據(jù) ,但各有其自己的堆棧。由于堆棧是每個(gè)線程一個(gè),所以局部變量對(duì)每一線程來說是私有的 。由于所有線程共享同樣的代碼和全局?jǐn)?shù)據(jù),它們比進(jìn)程更緊密,比單獨(dú)的進(jìn)程間更趨向于相互作用,線程間的相互作用更容易些,因?yàn)樗鼈儽旧砭陀心承┕┩ㄐ庞玫墓蚕韮?nèi)存:進(jìn)程的全局?jǐn)?shù)據(jù)。

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

(1)一個(gè)線程只能屬于一個(gè)進(jìn)程,而一個(gè)進(jìn)程可以有多個(gè)線程,但至少有一個(gè)線程。

(2)資源分配給進(jìn)程,同一進(jìn)程的所有線程共享該進(jìn)程的所有資源。

(3)處理機(jī)分給線程,即真正在處理機(jī)上運(yùn)行的是線程。

(4)線程在執(zhí)行過程中,需要協(xié)作同步。不同進(jìn)程的線程間要利用消息通信的辦法實(shí)現(xiàn)同步。

二、Python既支持多進(jìn)程,又支持多線程

multiprocessing --- 基于進(jìn)程的并行 — Python 3.10.0 文檔

threading --- 基于線程的并行 — Python 3.10.0 文檔

Python實(shí)現(xiàn)多進(jìn)程

在Unix/Linux下,Mac系統(tǒng)是基于BSD(Unix的一種)內(nèi)核,都可以使用fork()調(diào)用實(shí)現(xiàn)多進(jìn)程,Python的os模塊封裝了常見的系統(tǒng)調(diào)用,其中就包括fork。例如:

import os
 
print('Process (%s) start...' % os.getpid())
# Only works on Unix/Linux/Mac:
pid = os.fork()  #Windows中不支持fork(),將報(bào)錯(cuò)
if pid == 0:
    print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))
else:
print('I (%s) just created a child process (%s).' % (os.getpid(), pid))
 

需要注意的是,上述代碼在Unix/Linux、Mac系統(tǒng)中可以運(yùn)行,但在Windows中運(yùn)行報(bào)錯(cuò):

AttributeError: module 'os' has no attribute 'fork'

因?yàn)閃indows沒有fork調(diào)用,怎么辦?

multiprocessing模塊是跨平臺(tái)版本的多進(jìn)程模塊。在Windows上用Python編寫多進(jìn)程的程序,可以使用multiprocessing模塊。multiprocessing模塊提供了一個(gè)Process類來代表一個(gè)進(jìn)程對(duì)象。

Process進(jìn)程類的說明

Process([group [, target [, name [, args [, kwargs]]]]])

  • group:指定進(jìn)程組,目前只能使用None
  • target:執(zhí)行的目標(biāo)任務(wù)名
  • name:進(jìn)程名字,默認(rèn)為Process-N,N為從1開始遞增的整數(shù)
  • args:以元組方式給執(zhí)行任務(wù)傳參
  • kwargs:以字典方式給執(zhí)行任務(wù)傳參

Process創(chuàng)建的實(shí)例對(duì)象的常用方法:

  • start():?jiǎn)?dòng)子進(jìn)程實(shí)例(創(chuàng)建子進(jìn)程)
  • join():等待子進(jìn)程執(zhí)行結(jié)束
  • terminate():不管任務(wù)是否完成,立即終止子進(jìn)程

Process創(chuàng)建的實(shí)例對(duì)象的常用屬性:

例如:

import multiprocessing
import time
 
# 跳舞任務(wù)
def dance():
    for i in range(3):
        print("跳舞中...")
        time.sleep(0.2)
 
# 唱歌任務(wù)
def sing():
    for i in range(3):
        print("唱歌中...")
        time.sleep(0.2)
 
dance_process = multiprocessing.Process(target=dance(), name="myprocess1")
sing_process = multiprocessing.Process(target=sing())
 
# 啟動(dòng)子進(jìn)程執(zhí)行對(duì)應(yīng)的任務(wù)
dance_process.start()
sing_process.start()

執(zhí)行結(jié)果如下圖:

Python實(shí)現(xiàn)多線程

多任務(wù)可以由多進(jìn)程完成,也可以由一個(gè)進(jìn)程內(nèi)的多線程完成。

Python的標(biāo)準(zhǔn)庫(kù)提供了兩個(gè)模塊:_threadthreading,_thread是低級(jí)模塊,threading是高級(jí)模塊,對(duì)_thread進(jìn)行了封裝。絕大多數(shù)情況下,使用threading這個(gè)高級(jí)模塊。

線程類Thread

Thread([group [, target [, name [, args [, kwargs]]]]])

  • group: 線程組,目前只能使用None
  • target: 執(zhí)行的目標(biāo)任務(wù)名
  • args: 以元組的方式給執(zhí)行任務(wù)傳參
  • kwargs: 以字典方式給執(zhí)行任務(wù)傳參
  • name: 線程名,一般不用設(shè)置

Thread類提供了以下方法:

  • run(): 用以表示線程活動(dòng)的方法。
  • start():啟動(dòng)線程活動(dòng)。
  • join([time]): 等待至線程中止。這阻塞調(diào)用線程直至線程的join() 方法被調(diào)用中止-正常退出或者拋出未處理的異常-或者是可選的超時(shí)發(fā)生。
  • isAlive(): 返回線程是否活動(dòng)的。
  • getName(): 返回線程名。
  • setName(): 設(shè)置線程名。

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

import time, threading
 
# 新線程執(zhí)行的代碼:
def loop():
    print('thread %s is running...' % threading.current_thread().name)
    n = 0
    while n < 5:
        n = n + 1
        print('thread %s >>> %s' % (threading.current_thread().name, n))
        time.sleep(1)
    print('thread %s ended.' % threading.current_thread().name)
 
print('thread %s is running...' % threading.current_thread().name)
t = threading.Thread(target=loop, name='LoopThread')
t.start()
t.join()
print('thread %s ended.' % threading.current_thread().name)
 

執(zhí)行結(jié)果如下圖:

總結(jié)

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

相關(guān)文章

  • 詳細(xì)介紹Scrapy?shell的使用教程

    詳細(xì)介紹Scrapy?shell的使用教程

    Scrapy?shell是一個(gè)非常有用的工具,可以幫助開發(fā)者快速地測(cè)試和調(diào)試Scrapy的爬蟲代碼,這篇文章主要介紹了詳細(xì)介紹Scrapy?shell的使用,需要的朋友可以參考下
    2023-05-05
  • python簡(jiǎn)單貪吃蛇開發(fā)

    python簡(jiǎn)單貪吃蛇開發(fā)

    這篇文章主要為大家詳細(xì)介紹了python簡(jiǎn)單貪吃蛇開發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 使用 Django Highcharts 實(shí)現(xiàn)數(shù)據(jù)可視化過程解析

    使用 Django Highcharts 實(shí)現(xiàn)數(shù)據(jù)可視化過程解析

    這篇文章主要介紹了使用 Django Highcharts 實(shí)現(xiàn)數(shù)據(jù)可視化過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python批量將Word文件轉(zhuǎn)為PDF文件的實(shí)現(xiàn)示例

    Python批量將Word文件轉(zhuǎn)為PDF文件的實(shí)現(xiàn)示例

    如果想要批量把Word文檔轉(zhuǎn)換為PDF文檔,我們可以使用第三方模塊win32com,本文就來詳細(xì)的介紹一下Python批量將Word文件轉(zhuǎn)為PDF文件的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2023-08-08
  • python使用tkinter庫(kù)實(shí)現(xiàn)五子棋游戲

    python使用tkinter庫(kù)實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了python使用tkinter庫(kù)實(shí)現(xiàn)五子棋游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Python基于回溯法子集樹模板實(shí)現(xiàn)8皇后問題

    Python基于回溯法子集樹模板實(shí)現(xiàn)8皇后問題

    這篇文章主要介紹了Python基于回溯法子集樹模板實(shí)現(xiàn)8皇后問題,簡(jiǎn)單說明了8皇后問題的原理并結(jié)合實(shí)例形式分析了Python回溯法子集樹模板解決8皇后問題的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-09-09
  • python 實(shí)現(xiàn)A*算法的示例代碼

    python 實(shí)現(xiàn)A*算法的示例代碼

    本篇文章主要介紹了python 實(shí)現(xiàn)A*算法的示例代碼,A*作為最常用的路徑搜索算法,值得我們?nèi)ド羁痰难芯?,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Python中使用bidict模塊雙向字典結(jié)構(gòu)的奇技淫巧

    Python中使用bidict模塊雙向字典結(jié)構(gòu)的奇技淫巧

    bidict模塊通過一對(duì)一映射結(jié)構(gòu)的處理為Pyhton帶來雙向字典,能夠更加利用Python的切片功能,這里我們就來學(xué)習(xí)Python中使用bidict模塊雙向字典結(jié)構(gòu)的奇技淫巧:
    2016-07-07
  • OpenCV圖像分割之分水嶺算法與圖像金字塔算法詳解

    OpenCV圖像分割之分水嶺算法與圖像金字塔算法詳解

    本文主要介紹了OpenCV中的分水嶺算法、圖像金字塔對(duì)圖像進(jìn)行分割的方法。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定的幫助,需要的可以參考一下
    2021-12-12
  • Python?range()?函數(shù)用法詳解

    Python?range()?函數(shù)用法詳解

    range()是python內(nèi)置函數(shù)它能返回一系列連續(xù)增加的整數(shù),它的工作方式類似于分片,可以生成一個(gè)列表對(duì)象,這篇文章主要介紹了Python?range()?函數(shù)用法,需要的朋友可以參考下
    2023-03-03

最新評(píng)論

泗水县| 华亭县| 沈阳市| 台北县| 磐安县| 鹿泉市| 建始县| 巩留县| 肥东县| 防城港市| 揭阳市| 巴马| 双城市| 定陶县| 嘉峪关市| 临海市| 馆陶县| 宜都市| 资阳市| 开远市| 曲靖市| 德格县| 苏尼特左旗| 灌云县| 响水县| 双流县| 铅山县| 扎鲁特旗| 承德县| 马尔康县| 乐昌市| 九江市| 隆尧县| 双流县| 兴义市| 平安县| 多伦县| 库伦旗| 英德市| 景东| 双峰县|