【Python使用】python高階進階知識md總結第5篇:獲取程序編號,1. 獲取程序編號的目的【附程式碼文件】

程序员一诺yinuo發表於2024-03-20

python高階進階全知識知識筆記總結完整教程(附程式碼資料)主要內容講述:作業系統,虛擬機器軟體,Ubuntu作業系統,Linux核心及發行版,檢視目錄命令,切換目錄命令,絕對路徑和相對路徑,建立、刪除檔案及目錄命令,複製、移動檔案及目錄命令,終端命令格式的組成,檢視命令幫助。HTTP 請求報文,HTTP響應報文,搭建Python自帶靜態Web伺服器,靜態Web伺服器-返回固定頁面資料。靜態Web伺服器-返回指定頁面資料,靜態Web伺服器-多工版,靜態Web伺服器-物件導向開發。靜態Web伺服器-命令列啟動動態繫結埠號,html 的介紹,html 的基本結構,vscode 的基本使用,初始常用的 html 標籤,資源路徑,列表標籤,表格標籤。表單標籤,表單提交,css 的介紹,css 的引入方式,css 選擇器。css 屬性,JavaScript的介紹,JavaScript的使用方式,變數和資料型別,函式定義和呼叫,變數作用域,條件語句,獲取標籤元素。操作標籤元素屬性,陣列及操作方法,迴圈語句,字串拼接,定時器,jQuery的介紹,jQuery的用法,jQuery選擇器,選擇集過濾。選擇集轉移,獲取和設定元素內容,獲取和設定元素屬性,jQuery事件,事件,JavaScript物件,json。ajax,資料庫,關係型資料庫管理系統。MySQL資料庫,資料型別和約束。命令列客戶端MySQL的使用,as和distinct關鍵字,where條件查詢,排序,分頁查詢。ls命令選項,mkdir和rm命令選項,cp和mv命令選項,重定向命令,檢視檔案內容命令,連結命令,文字搜尋命令,查詢檔案命令。聚合函式,分組查詢,連線查詢-內連線,連線查詢-左連線,連線查詢-右連線,連線查詢-自連線,子查詢。資料庫設計之三正規化,外來鍵SQL語句的編寫,演練-分組和聚合函式的組合使用,將查詢結果插入到其它表中,使用連線更新表中某個欄位資料。建立表並給某個欄位新增資料,修改goods表結構,PyMySQL的使用。事務,索引。閉包,閉包的使用,修改閉包內使用的外部變數,裝飾器,裝飾器的使用,通用裝飾器的使用,多個裝飾器的使用。帶有引數的裝飾器,類裝飾器的使用,web框架概述,框架程式開發,模板替換功能開發。路由列表功能開發,裝飾器方式的新增路由,顯示股票資訊頁面的開發,個人中心資料介面的開發,ajax請求資料渲染個人中心頁面。logging日誌,property屬性。with語句和上下文管理器,生成器的建立方式。深複製和淺複製,正規表示式的概述,re模組介紹,匹配單個字元。壓縮和解壓縮命令,檔案許可權命令,獲取管理員許可權的相關命令,使用者相關操作,使用者組相關操作,遠端登入、遠端複製命令。匹配多個字元,匹配開頭和結尾,匹配分組。編輯器 vim,軟體安裝,軟體解除安裝,多工的介紹,程序,多程序的使用。獲取程序編號,程序執行帶有引數的任務,程序的注意點,執行緒,多執行緒的使用。執行緒執行帶有引數的任務,執行緒的注意點,互斥鎖。死鎖,程序和執行緒的對比,IP 地址的介紹,埠和埠號的介紹,TCP 的介紹,socket 的介紹。TCP 網路應用程式開發流程,TCP 客戶端程式開發,TCP服務端程式開發,TCP網路應用程式的注意點。案例-多工版TCP服務端程式開發,socket之send和recv原理剖析,HTTP 協議,URL,檢視HTTP協議的通訊過程。

全套筆記資料程式碼移步: 前往gitee倉庫檢視

感興趣的小夥伴可以自取哦,歡迎大家點贊轉發~


全套教程部分目錄:


部分檔案圖片:

獲取程序編號

學習目標

  • 能夠知道如果獲取程序編號

1. 獲取程序編號的目的

獲取程序編號的目的是驗證主程序和子程序的關係,可以得知子程序是由那個主程序建立出來的。

獲取程序編號的兩種操作

  • 獲取當前程序編號
  • 獲取當前父程序編號

2. 獲取當前程序編號

os.getpid() 表示獲取當前程序編號

示例程式碼:

import multiprocessing
import time
import os


  
  
# 跳舞任務
  
  
def dance():
    # 獲取當前程序的編號
    print("dance:", os.getpid())
    # 獲取當前程序
    print("dance:", multiprocessing.current_process())
    for i in range(5):
        print("跳舞中...")
        time.sleep(0.2)
        # 擴充套件:根據程序編號殺死指定程序
        os.kill(os.getpid(), 9)


  
  
# 唱歌任務
  
  
def sing():
    # 獲取當前程序的編號
    print("sing:", os.getpid())
    # 獲取當前程序
    print("sing:", multiprocessing.current_process())
    for i in range(5):
        print("唱歌中...")
        time.sleep(0.2)


if __name__ == '__main__':

    # 獲取當前程序的編號
    print("main:", os.getpid())
    # 獲取當前程序
    print("main:", multiprocessing.current_process())
    # 建立跳舞的子程序
    # group: 表示程序組,目前只能使用None
    # target: 表示執行的目標任務名(函式名、方法名)
    # name: 程序名稱, 預設是Process-1, .....
    dance_process = multiprocessing.Process(target=dance, name="myprocess1")
    sing_process = multiprocessing.Process(target=sing)

    # 啟動子程序執行對應的任務
    dance_process.start()
    sing_process.start()

執行結果:

main: 70763
main: <_MainProcess(MainProcess, started)>
dance: 70768
dance: <Process(myprocess1, started)>
跳舞中...
sing: 70769
sing: <Process(Process-2, started)>
唱歌中...
唱歌中...
唱歌中...
唱歌中...
唱歌中...

3. 獲取當前父程序編號

os.getppid() 表示獲取當前父程序編號

示例程式碼:

import multiprocessing
import time
import os


  
  
# 跳舞任務
  
  
def dance():
    # 獲取當前程序的編號
    print("dance:", os.getpid())
    # 獲取當前程序
    print("dance:", multiprocessing.current_process())
    # 獲取父程序的編號
    print("dance的父程序編號:", os.getppid())
    for i in range(5):
        print("跳舞中...")
        time.sleep(0.2)
        # 擴充套件:根據程序編號殺死指定程序
        os.kill(os.getpid(), 9)


  
  
# 唱歌任務
  
  
def sing():
    # 獲取當前程序的編號
    print("sing:", os.getpid())
    # 獲取當前程序
    print("sing:", multiprocessing.current_process())
    # 獲取父程序的編號
    print("sing的父程序編號:", os.getppid())
    for i in range(5):
        print("唱歌中...")
        time.sleep(0.2)


if __name__ == '__main__':

    # 獲取當前程序的編號
    print("main:", os.getpid())
    # 獲取當前程序
    print("main:", multiprocessing.current_process())
    # 建立跳舞的子程序
    # group: 表示程序組,目前只能使用None
    # target: 表示執行的目標任務名(函式名、方法名)
    # name: 程序名稱, 預設是Process-1, .....
    dance_process = multiprocessing.Process(target=dance, name="myprocess1")
    sing_process = multiprocessing.Process(target=sing)

    # 啟動子程序執行對應的任務
    dance_process.start()
    sing_process.start()
main: 70860
main: <_MainProcess(MainProcess, started)>
dance: 70861
dance: <Process(myprocess1, started)>
dance的父程序編號: 70860
跳舞中...
sing: 70862
sing: <Process(Process-2, started)>
sing的父程序編號: 70860
唱歌中...
唱歌中...
唱歌中...
唱歌中...
唱歌中...

4. 小結

  • 獲取當前程序編號

    • os.getpid()
  • 獲取當前父程序編號

    • os.getppid()
  • 獲取程序編號可以檢視父子程序的關係

程序執行帶有引數的任務

學習目標

  • 能夠寫出程序執行帶有引數的任務

1. 程序執行帶有引數的任務的介紹

前面我們使用程序執行的任務是沒有引數的,假如我們使用程序執行的任務帶有引數,如何給函式傳參呢?

Process類執行任務並給任務傳引數有兩種方式:

  • args 表示以元組的方式給執行任務傳參
  • kwargs 表示以字典方式給執行任務傳參

2. args引數的使用

示例程式碼:

import multiprocessing
import time


  
  
# 帶有引數的任務
  
  
def task(count):
    for i in range(count):
        print("任務執行中..")
        time.sleep(0.2)
    else:
        print("任務執行完成")


if __name__ == '__main__':
    # 建立子程序
    # args: 以元組的方式給任務傳入引數
    sub_process = multiprocessing.Process(target=task, args=(5,))
    sub_process.start()

執行結果:

任務執行中..
任務執行中..
任務執行中..
任務執行中..
任務執行中..
任務執行完成

3. kwargs引數的使用

示例程式碼:

import multiprocessing
import time


  
  
# 帶有引數的任務
  
  
def task(count):
    for i in range(count):
        print("任務執行中..")
        time.sleep(0.2)
    else:
        print("任務執行完成")


if __name__ == '__main__':
    # 建立子程序

    # kwargs: 表示以字典方式傳入引數
    sub_process = multiprocessing.Process(target=task, kwargs={"count": 3})
    sub_process.start()

執行結果:

任務執行中..
任務執行中..
任務執行中..
任務執行完成

4. 小結

  • 程序執行任務並傳參有兩種方式:

    • 元組方式傳參(args): 元組方式傳參一定要和引數的順序保持一致。
    • 字典方式傳參(kwargs): 字典方式傳參字典中的key一定要和引數名保持一致。

程序的注意點

學習目標

  • 能夠說出程序的注意點

1. 程序的注意點介紹

  1. 程序之間不共享全域性變數
  2. 主程序會等待所有的子程序執行結束再結束

2. 程序之間不共享全域性變數

import multiprocessing
import time

  
  
# 定義全域性變數
  
  
g_list = list()


  
  
# 新增資料的任務
  
  
def add_data():
    for i in range(5):
        g_list.append(i)
        print("add:", i)
        time.sleep(0.2)

    # 程式碼執行到此,說明資料新增完成
    print("add_data:", g_list)


def read_data():
    print("read_data", g_list)


if __name__ == '__main__':
    # 建立新增資料的子程序
    add_data_process = multiprocessing.Process(target=add_data)
    # 建立讀取資料的子程序
    read_data_process = multiprocessing.Process(target=read_data)

    # 啟動子程序執行對應的任務
    add_data_process.start()
    # 主程序等待新增資料的子程序執行完成以後程式再繼續往下執行,讀取資料
    add_data_process.join()
    read_data_process.start()

    print("main:", g_list)

    # 總結: 多程序之間不共享全域性變數

執行結果:

add: 0
add: 1
add: 2
add: 3
add: 4
add_data: [0, 1, 2, 3, 4]
main: []
read_data []

程序之間不共享全域性變數的解釋效果圖:

程序關係

3. 程序之間不共享全域性變數的小結

  • 建立子程序會對主程序資源進行複製,也就是說子程序是主程序的一個副本,好比是一對雙胞胎,之所以程序之間不共享全域性變數,是因為操作的不是同一個程序裡面的全域性變數,只不過不同程序裡面的全域性變數名字相同而已。

4. 主程序會等待所有的子程序執行結束再結束

假如我們現在建立一個子程序,這個子程序執行完大概需要2秒鐘,現在讓主程序執行0.5秒鐘就退出程式,檢視一下執行結果,示例程式碼如下:

import multiprocessing
import time


  
  
# 定義程序所需要執行的任務
  
  
def task():
    for i in range(10):
        print("任務執行中...")
        time.sleep(0.2)

if __name__ == '__main__':
    # 建立子程序
    sub_process = multiprocessing.Process(target=task)
    sub_process.start()

    # 主程序延時0.5秒鐘
    time.sleep(0.5)
    print("over")
    exit()

    # 總結: 主程序會等待所有的子程序執行完成以後程式再退出

執行結果:

任務執行中...
任務執行中...
任務執行中...
over
任務執行中...
任務執行中...
任務執行中...
任務執行中...
任務執行中...
任務執行中...
任務執行中...

說明:

透過上面程式碼的執行結果,我們可以得知: 主程序會等待所有的子程序執行結束再結束

假如我們就讓主程序執行0.5秒鐘,子程序就銷燬不再執行,那怎麼辦呢?

  • 我們可以設定守護主程序 或者 在主程序退出之前 讓子程序銷燬

守護主程序:

  • 守護主程序就是主程序退出子程序銷燬不再執行

子程序銷燬:

  • 子程序執行結束

保證主程序正常退出的示例程式碼:

import multiprocessing
import time


  
  
# 定義程序所需要執行的任務
  
  
def task():
    for i in range(10):
        print("任務執行中...")
        time.sleep(0.2)

if __name__ == '__main__':
    # 建立子程序
    sub_process = multiprocessing.Process(target=task)
    # 設定守護主程序,主程序退出子程序直接銷燬,子程序的生命週期依賴與主程序
    # sub_process.daemon = True
    sub_process.start()

    time.sleep(0.5)
    print("over")
    # 讓子程序銷燬
    sub_process.terminate()
    exit()

    # 總結: 主程序會等待所有的子程序執行完成以後程式再退出
    # 如果想要主程序退出子程序銷燬,可以設定守護主程序或者在主程序退出之前讓子程序銷燬

執行結果:

任務執行中...
任務執行中...
任務執行中...
over

5. 主程序會等待所有的子程序執行結束再結束的小結

  • 為了保證子程序能夠正常的執行,主程序會等所有的子程序執行完成以後再銷燬,設定守護主程序的目的是主程序退出子程序銷燬,不讓主程序再等待子程序去執行
  • 設定守護主程序方式: 子程序物件.daemon = True
  • 銷燬子程序方式: 子程序物件.terminate()

執行緒

學習目標

能夠知道執行緒的作用


1. 執行緒的介紹

在Python中,想要實現多工除了使用程序,還可以使用執行緒來完成,執行緒是實現多工的另外一種方式。

2. 執行緒的概念

執行緒是程序中執行程式碼的一個分支,每個執行分支(執行緒)要想工作執行程式碼需要cpu進行排程 ,也就是說執行緒是cpu排程的基本單位,每個程序至少都有一個執行緒,而這個執行緒就是我們通常說的主執行緒。

3. 執行緒的作用

多執行緒可以完成多工

多執行緒效果圖:

執行緒

4. 小結

  • 執行緒是Python程式中實現多工的另外一種方式,執行緒的執行需要cpu排程來完成。

多執行緒的使用

學習目標

  • 能夠使用多執行緒完成多工

1. 匯入執行緒模組

  
  
#匯入執行緒模組
  
  
import threading

2. 執行緒類Thread引數說明

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

  • group: 執行緒組,目前只能使用None
  • target: 執行的目標任務名
  • args: 以元組的方式給執行任務傳參
  • kwargs: 以字典方式給執行任務傳參
  • name: 執行緒名,一般不用設定

3. 啟動執行緒

啟動執行緒使用start方法

4. 多執行緒完成多工的程式碼

import threading
import time

  
  
# 唱歌任務
  
  
def sing():
    # 擴充套件: 獲取當前執行緒
    # print("sing當前執行的執行緒為:", threading.current_thread())
    for i in range(3):
        print("正在唱歌...%d" % i)
        time.sleep(1)

  
  
# 跳舞任務
  
  
def dance():
    # 擴充套件: 獲取當前執行緒
    # print("dance當前執行的執行緒為:", threading.current_thread())
    for i in range(3):
        print("正在跳舞...%d" % i)
        time.sleep(1)


if __name__ == '__main__':
    # 擴充套件: 獲取當前執行緒
    # print("當前執行的執行緒為:", threading.current_thread())
    # 建立唱歌的執行緒
    # target: 執行緒執行的函式名
    sing_thread = threading.Thread(target=sing)

    # 建立跳舞的執行緒
    dance_thread = threading.Thread(target=dance)

    # 開啟執行緒
    sing_thread.start()
    dance_thread.start()

執行結果:

正在唱歌...0
正在跳舞...0
正在唱歌...1
正在跳舞...1
正在唱歌...2
正在跳舞...2

5. 小結

  1. 匯入執行緒模組

    • import threading
  2. 建立子執行緒並指定執行的任務

    • sub_thread = threading.Thread(target=任務名)
  3. 啟動執行緒執行任務

    • sub_thread.start()

未完待續, 同學們請等待下一期

全套筆記資料程式碼移步: 前往gitee倉庫檢視

感興趣的小夥伴可以自取哦,歡迎大家點贊轉發~

相關文章