python 多執行緒 多行程同時運行
多任務要求
- python 基礎語法
- python 檔案目錄操作
- python 模塊應用
開發工具
pycharm
實作方法
多任務的實作可以用行程和執行緒來實作
行程—> 執行緒----> 多任務應用
多行程操作
比如下載多個檔案, 利用cpu 資源 提高效率
多任務: 同一時間執行多個任務, 比如windows作業系統
執行方式有兩種( 表現形式 )
并發
在單核cpu中:
在一段時間內交替執行多個任務, 例如單核cpu 處理多任務, 作業系統讓各個任務交替進行
并行
多核cpu 給每個核都分配一個任務 每個核執行自己的任務
真正意義上的同時執行
如何實作( 原理 )
多行程
python 中實作多行程來實作多任務, 行程是作業系統進行資源分配和調度的最小單位, 一個運行起來的程式叫做行程, 沒有在運行的程式叫做程式
當一個.py 檔案運行的時候系統會創建一個主行程
比如
def fun1():
print(1)
def fun2():
print(2)
fun1()
fun2()
代碼運行的時候系統會先執行fun1 在執行fun2 按順序運行
使用多行程的話: 在程式運行的時候會創建一個主行程, 那么在程式運行除了主行程之外創建一個子行程, 我們讓主行程去執行fun1(), 讓子行程去執行fun2(), 讓他們兩個同時執行, 來實作多任務同時進行
多行程完成多任務
首先要知道如何去創建第二個行程, 第三個行程, 行程的創建有三個步驟
- 匯入行程包
import multiprocessing
- 通過行程類去創建行程物件
- 行程物件=multiprocessing.Process()
- 啟動行程執行任務
- 行程物件.start() 來開始執行行程
import threading
import time
import os
def fun1():
for i in range(3):
print('1')
time.sleep(1)
def fun2():
for i in range(3):
print('2')
time.sleep(3)
if __name__ == '__main__':
sing_thread = threading.Thread(target=fun1)
song_thread = threading.Thread(target=fun2)
sing_thread.start()
song_thread.start()
通過行程類創建行程物件
行程物件 = multiprocessing.Process(target= 任務名)
| 引數名 | 說明 |
|---|---|
| target | 執行的目標任務名, 這里指的是函式名(方法名) |
| name | 行程名, 一般不用設定(系統自動為行程設定默認名字Process-1····) |
| group | 行程組, 目前只能使用None |
必須要指定行程的名字target
def none():
pass
process = multiprocessing.Process(target=none)
process.start()
行程如何執行帶有引數的任務
| 引數名 | 說明 |
|---|---|
| args | 以元祖的方式給任務傳遞引數, 順序要正確 |
| kwrags | 以字典的方式給執行任務傳遞引數, key 跟引數名要一致 |
process = multiprocessing.Process(target=function, args=(10,)) arg傳遞的必須是引數所以傳遞一個變數的時候需要(10,)
process = multiprocessing.Process(target=function, kwargs={'key': value})
import multiprocessing
import time
import os
def fun1(num):
print('1行程PID', os.getpid())
print('1行程父行程編號', os.getppid())
for i in range(num):
print('1....\n')
time.sleep(0.5)
def fun2(num):
print('2行程PID', os.getpid())
print('2行程父行程編號', os.getppid())
for i in range(num):
print('2...')
time.sleep(0.5)
# 1. 匯入行程包
if __name__ == '__main__':
sing_process = multiprocessing.Process(target=fun1, args=(5,))
dance_process = multiprocessing.Process(target=fun2, kwargs={'num':2}) # target
#3. 啟動行程
sing_process.start()
dance_process.start()
獲取行程編號
- 獲取當前行程的編號
- os.getpid()
- 獲取當前父行程的編號
- os.getppid()
import os
os.getpid()
def work():
print('work 行程編號', os.getpid())
print('work 父行程編號', os.getppid())
主行程默認不會結束, 在子行程全部結束之后才會關閉主行程
在實際中我們想要的效果, 主行程關閉,, 子行程全部關閉
設定守護主行程
希望主行程關閉的時候子行程不在執行. 則需要設定守護選項
子行程物件.daemon=True 那么在主行程運行完成之后, 那么子行程也將會自動結束
os 部分操作
os 創建目標檔案夾目錄
os.mkdir(dir)
多執行緒
實作多任務的另一種形式, 行程是分配資源的最小單位, 執行緒是程式執行的最小單位, 一個行程中最少有一個執行緒來負責該行程, 比如一個QQ(一個行程) 打開了兩個視窗(兩個執行緒)跟兩個人聊天, 執行緒自己并不需要系統資源, 執行緒與其他執行緒共享這個行程的資源, 因此使用多執行緒的時候實作了資源節約,
- 多執行緒是Python 程式中實作多任務的一種方式
- 執行緒是程式執行的最小單位
- 同屬于一個行程的多執行緒共享行程擁有的所有資源
多執行緒實作多任務
執行緒的創建步驟
- 匯入執行緒模塊
import threading
- 通過執行緒類去創建執行緒物件
執行緒物件=threading.Thread(target=任務名)
- 啟動執行緒執行任務
- 執行緒物件.start()
| 引數名 | 說明 |
|---|---|
| target | 執行目標的任務名, 這里值函式名( 方法名) |
| name | 執行緒名, 一般不用設定 |
| group | 執行緒組, 目前只能使用None |
其他的一毛一樣
行程執行緒對比
關系對比
- 執行緒是依附在行程里邊的, 沒有行程就沒有執行緒
- 一個行程默認提供一條執行緒, 行程可以創建多個執行緒
區別對比
- 行程創建的開銷要比執行緒的開銷要大
- 行程是作業系統資源分配的基本單位, 執行緒是cpu 調度的基本單位
- 執行緒不能獨立執行, 必須依存行程
優缺點對比
-
行程優缺點:
優點:可以用多核
缺點:資源開銷大
-
執行緒優缺點
優點: 資源開銷小
缺點:不能使用多核
本筆記總結于bilibili 黑馬程式員
多行程多執行緒視頻
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274179.html
標籤:其他
