" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python多線程編程入門詳解

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

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

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

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

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

任務(wù)

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

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

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

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

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

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

多核CPU:簡單地說是將多個核心裝載一個封裝里,外觀上看是一個處理器。

串行:一個處理完再一個。

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

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

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

進程

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

線程

(tread)則是某一進程中一路單獨運行的程序。也就是說,線程存在于進程之中。一個進程由一個或多個線程構(gòu)成,各線程共享相同的代碼和全局數(shù)據(jù) ,但各有其自己的堆棧。由于堆棧是每個線程一個,所以局部變量對每一線程來說是私有的 。由于所有線程共享同樣的代碼和全局數(shù)據(jù),它們比進程更緊密,比單獨的進程間更趨向于相互作用,線程間的相互作用更容易些,因為它們本身就有某些供通信用的共享內(nèi)存:進程的全局數(shù)據(jù)。

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

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

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

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

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

二、Python既支持多進程,又支持多線程

multiprocessing --- 基于進程的并行 — Python 3.10.0 文檔

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

Python實現(xiàn)多進程

在Unix/Linux下,Mac系統(tǒng)是基于BSD(Unix的一種)內(nèi)核,都可以使用fork()調(diào)用實現(xià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(),將報錯
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)中可以運行,但在Windows中運行報錯:

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

因為Windows沒有fork調(diào)用,怎么辦?

multiprocessing模塊是跨平臺版本的多進程模塊。在Windows上用Python編寫多進程的程序,可以使用multiprocessing模塊。multiprocessing模塊提供了一個Process類來代表一個進程對象。

Process進程類的說明

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

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

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

  • start():啟動子進程實例(創(chuàng)建子進程)
  • join():等待子進程執(zhí)行結(jié)束
  • terminate():不管任務(wù)是否完成,立即終止子進程

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

例如:

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())
 
# 啟動子進程執(zhí)行對應(yīng)的任務(wù)
dance_process.start()
sing_process.start()

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

Python實現(xiàn)多線程

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

Python的標準庫提供了兩個模塊:_threadthreading,_thread是低級模塊,threading是高級模塊,對_thread進行了封裝。絕大多數(shù)情況下,使用threading這個高級模塊。

線程類Thread

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

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

Thread類提供了以下方法:

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

啟動一個線程就是把一個函數(shù)傳入并創(chuàng)建Thread實例,然后調(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)文章

  • python?open函數(shù)中newline參數(shù)實例詳解

    python?open函數(shù)中newline參數(shù)實例詳解

    newLine()方法可用于輸出一個換行字符"/n",下面這篇文章主要給大家介紹了關(guān)于python?open函數(shù)中newline參數(shù)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • python篩選出兩個文件中重復行的方法

    python篩選出兩個文件中重復行的方法

    這篇文章主要為大家詳細介紹了python篩選出兩個文件中重復行的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Python 微信爬蟲完整實例【單線程與多線程】

    Python 微信爬蟲完整實例【單線程與多線程】

    這篇文章主要介紹了Python 微信爬蟲,結(jié)合完整實例形式分析了Python基于單線程與多線程模式爬取微信信息相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • Python網(wǎng)絡(luò)爬蟲中的同步與異步示例詳解

    Python網(wǎng)絡(luò)爬蟲中的同步與異步示例詳解

    這篇文章主要給大家介紹了關(guān)于Python網(wǎng)絡(luò)爬蟲中同步與異步的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-02-02
  • Pyhton多線程采集圖片方式

    Pyhton多線程采集圖片方式

    這篇文章主要介紹了Pyhton多線程采集圖片方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Anaconda+vscode+pytorch環(huán)境搭建過程詳解

    Anaconda+vscode+pytorch環(huán)境搭建過程詳解

    這篇文章主要介紹了Anaconda+vscode+pytorch環(huán)境搭建過程詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • Python+OpenCV圖片局部區(qū)域像素值處理改進版詳解

    Python+OpenCV圖片局部區(qū)域像素值處理改進版詳解

    這篇文章主要為大家詳細介紹了Python+OpenCV圖片局部區(qū)域像素值處理的改進版,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • windows 10下安裝搭建django1.10.3和Apache2.4的方法

    windows 10下安裝搭建django1.10.3和Apache2.4的方法

    最近發(fā)現(xiàn)很多教程都是在linux上搭建,windows上似乎天生不太適合,但是我還是愿意試試這個坑。下面這篇文章主要給大家介紹了在windows 10系統(tǒng)下安裝搭建django1.10.3和Apache2.4的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • Python 操作 MongoDB 講解詳細

    Python 操作 MongoDB 講解詳細

    MongoDB是一款開源的、基于分布式的、面向文檔存儲的非關(guān)系型數(shù)據(jù)庫。擁有高性能、高可用,易擴展的優(yōu)點,并且支持豐富的查詢語言來支持讀寫操作以及更復雜的查詢等。接下來我們來看一下如何使用Python操作MongoDB數(shù)據(jù)庫
    2021-09-09
  • 利用Python實現(xiàn)一個簡易的截圖工具

    利用Python實現(xiàn)一個簡易的截圖工具

    這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)一個簡易的截圖工具,可以截完圖之后顯示并且永遠前置,感興趣的小伙伴可以嘗試一下
    2022-07-07

最新評論