1. 程式人生 > >python之執行緒和程序

python之執行緒和程序

1.建立執行緒
–執行緒
–程序
—一個程序裡面必定會有一個主執行緒
python執行緒的模組

這裡寫圖片描述

這裡寫圖片描述

2._thread 模組中建立多執行緒
import _thread
import threading

import time
def job(name):
print(“這是一個需要執行的任務”)
# # 啟用的執行緒個數
# print(“當前執行緒的個數:”, threading.active_count())
# # 列印當前執行緒的詳細資訊
# print(“當前執行緒資訊:”, threading.current_thread())
print(name, time.ctime())
time.sleep(2)
if name

== “main”:
# 建立多個執行緒, 但是沒有開始執行任務;
_thread.start_new_thread(job,(‘thread1’, ))
_thread.start_new_thread(job,(‘thread2’, ))
while True:
pass
結果:thread1 2018-09-15 thread2 2018-09-15

3._threading建立執行緒方法·
通過例項化物件建立多執行緒
這裡寫圖片描述

這裡寫圖片描述
這裡可以新增 t2, 用相同的方法,那麼會有三個程序,程序的名稱為job1
注意:target後是函式名,name後是程序名稱,而args後則是要傳的引數。

4.不使用多執行緒


這裡寫圖片描述
很明顯,如果不使用多執行緒那麼執行緒就會排序執行,依次完成,所以總共會花費4.5秒時間,這是很浪費時間的。

這裡寫圖片描述

5.多執行緒的join方法
前面的不變
if name=’main’:
start_time=time.time( )
t1=threading.Thread(target=music,args=(‘有點甜’,) )
t2=threading.Thread(target=music,args=(‘有點甜’,) )

t1.start()
t2.start()

# 等待所有的子執行緒執行結束之後, 繼續執行主執行緒的內容;
t1.join()
t2.join()

print("花費時間: %s" %(time.time()-start_time)) 
執行如下

這裡寫圖片描述

這裡寫圖片描述
這樣的話,就可以多個執行緒同時進行,總時間為時間長的進
程就是三秒。
注意:在此處的.join( )方法目的是阻塞主執行緒,使執行緒結束後才執行主執行緒,去掉的話如下

這裡寫圖片描述

6.整理join的詳細理解
這裡寫圖片描述

返回結果為 job job main ,停一秒輸出一次job 。

7.執行緒同步之執行緒鎖

為什麼會需要執行緒鎖
多個執行緒對同一個資料進行修改時,可能出現不可預料的情況
如何新增執行緒鎖

這裡寫圖片描述

因為遇到數量龐大的計算時會出現錯誤,所以新增執行緒鎖

這裡寫圖片描述
返回結果

這裡寫圖片描述
新增鎖子之後,計算無誤差

8.GIL全域性直譯器鎖

python使用多執行緒 , 是個好主意麼? 為什麼?
- GIL(全域性直譯器鎖)
- python直譯器預設每次只允許一個執行緒執行
執行過程:
1). 設定GIL
2). 切換到執行緒去執行對應的任務;
3). 執行
- 執行完了
- time.sleep()
- 獲取其他資訊才能繼續執行, eg: 從網路上獲取網頁資訊等;
3. 把執行緒設定為睡眠狀態
4. 解鎖GIL
5.再次重複執行上述內容;
python直譯器:Cpython直譯器, Jpython直譯器, p-python直譯器

方法的選擇:
Python並不支援真正意義上的多執行緒。Python中提供了多執行緒包,但是如果你想通過多執行緒提高程式碼的速度,
使用多執行緒包並不是個好主意。Python中有一個被稱為Global Interpreter Lock(GIL)的東西,
它會確保任何時候你的多個執行緒中,只有一個被執行。執行緒的執行速度非常之快,會讓你誤以為執行緒是並行執行的,
但是實際上都是輪流執行。經過GIL這一道關卡處理,會增加執行的開銷。這意味著,如果你想提高程式碼的執行速度,
使用threading包並不是一個很好的方法。
# I/O密集型操作: 多執行緒操作
# CPU/計算密集型:
“”"
實驗如圖

這裡寫圖片描述

此處的裝飾器如下

這裡寫圖片描述

執行結果如下

這裡寫圖片描述
這裡我們發現,多執行緒在python直譯器中速度是比較慢的。

9.threading的set_daemon方法實現

當主執行緒執行結束,讓沒有執行的執行緒強制結束;set_ daemon

這裡寫圖片描述

這裡寫圖片描述

這裡主執行緒執行非常快

10.佇列與多執行緒

1). 理論上多執行緒執行任務, 會產生一些資料, 為其他程式執行作鋪墊;
2). 多執行緒是不能返回任務執行結果的, 因此需要一個容器來儲存多執行緒產生的資料
3). 這個容器如何選擇? list(棧, 佇列), tuple(x), set(x), dict(x), 此處選擇佇列來實現

這裡寫圖片描述

這裡寫圖片描述

11. threading的建立執行緒方法 —任務無需任何引數

這裡寫圖片描述

這裡寫圖片描述

12.執行緒中的兩個方法(重中之重)
1.例項化方法
在這裡插入圖片描述

在這裡插入圖片描述
這是通過例項化完成的
用執行緒的方法控制程式進行

2.繼承之方法
在這裡插入圖片描述

在這裡插入圖片描述

這是通過繼承方法實現的