寫在前面
關于線程的內容我們此前在R語言中給大家介紹過:調用的線程越多就算的越快嘛?。簡單來說多線程/并行計算就是讓機器同時完成多個”任務”,能減少任務的等待時間與機器資源的閑置拓瞪,從而大大提升各位的生產效率阱飘。
實現(xiàn)方式
多線程在Python中的實現(xiàn)主要通過threading
模塊來完成秦躯。語法為:
import threading
thread_obj = threading.Tread([group[, target[,name[, args [, kwargs]]]]])
- group: 未來功能的預留參數(shù)
- target: 執(zhí)行的目標任務名
- args: 以元組的方式給任務傳參
- kwargs:以字典方式給執(zhí)行任務傳參
- name:線程名被啼,一般不用設置
啟動程序斩披,讓線程開始工作:
thread_obj.start()
通過實例來感受一下:
1 無參數(shù)函數(shù)的并行
# 單線程模式
import time
# 定義兩個函數(shù)
def fir_task():
temp_num = 0
while temp_num < 3:
print("這是任務1的輸出")
time.sleep(1)
temp_num += 1
def sec_task():
temp_num = 0
while temp_num < 3:
print("這是任務2的輸出")
time.sleep(1)
temp_num += 1
# 定義一個新函數(shù)調用這兩個函數(shù)
def my_print():
fir_task()
sec_task()
my_print()
## 這是任務1的輸出
## 這是任務1的輸出
## 這是任務1的輸出
## 這是任務2的輸出
## 這是任務2的輸出
## 這是任務2的輸出
可以看到上面的代碼中,任務1的結果輸出之后晕粪,任務2才開始執(zhí)行挤悉。此時命令的運行邏輯是串聯(lián)的,但顯然我們的計算機的算力足夠讓這兩個任務同時運行巫湘,所以我們需要用調用并行來完成這兩個任務:
# 多線程模式
# 導入模塊
import threading,time
# 定義兩個函數(shù)
def fir_task():
temp_num = 0
while temp_num < 3:
print("這是任務1的輸出")
time.sleep(1)
temp_num += 1
def sec_task():
temp_num = 0
while temp_num < 3:
print("這是任務2的輸出")
time.sleep(1)
temp_num += 1
# 定義一個新函數(shù)調用這兩個函數(shù)
def my_print():
fir_task_thread = threading.Thread(target = fir_task)
sec_task_thread = threading.Thread(target = sec_task)
fir_task_thread.start()
sec_task_thread.start()
my_print()
## 這是任務1的輸出
## 這是任務2的輸出
可以看出装悲,這時任務1和任務2的結果就是交叉輸入啦,也就是兩個任務的關系處于并行狀態(tài)尚氛,這對大數(shù)據(jù)計算時節(jié)省計算時間尤為重要诀诊。
2 傳參函數(shù)的并行
我們上面舉的例子較為簡單,因為定義的函數(shù)無需傳遞參數(shù)阅嘶,當需要傳遞參數(shù)時需要通過args
傳遞元素或使用kwargs
傳遞字典属瓣。
import threading,time
def fir_task(mytask):
temp_num = 0
while temp_num < 3:
print(mytask)
time.sleep(1)
temp_num += 1
def sec_task(mytask):
temp_num = 0
while temp_num < 3:
print(mytask)
time.sleep(1)
temp_num += 1
# 定義一個新函數(shù)調用這兩個函數(shù)
def my_print():
fir_task_thread = threading.Thread(target = fir_task,args=("自定義任務1",))
sec_task_thread = threading.Thread(target = sec_task,args=("自定義任務2",))
fir_task_thread.start()
sec_task_thread.start()
my_print()
## 自定義任務1
## 自定義任務2
可以看出我們向原函數(shù)傳遞了位置參數(shù)
往期回顧
一文了解Python基礎:字面量、注釋讯柔、變量抡蛙、類型、運算符