1. 程式人生 > >python_day27__執行緒和程序_threading模組_

python_day27__執行緒和程序_threading模組_


#Author:'haijing'
#date:2018/11/18

# 只有作業系統(os)才可以去調動cpu、硬碟等
# 以前寫的每一個.py檔案就是一個程序,這個程序中只有一個主執行緒
#比如qq就是一個程序,qq這個程序中有很多的功能,
#執行緒是可以資源共享的(共享cpu的資源),但是程序是不可以資源共享的,比如360收不到qq訊息
#能讓作業系統工作起來的最小單位就是執行緒
#自己寫的一個py檔案中的一堆指令,就是一個執行緒。這堆指令被執行的時候,就排程了cpu
#或一個指令集就是一個執行緒
#只有一個cpu的話去執行多個程式,方法是以很快的速度去切換,使用者是感受不到這個速度的,但是切換也是會有耽誤時間的

#I/O密集型任務或函式(多用多執行緒,因為有阻塞的狀態)
#計算密集型任務或函式(少用多執行緒,因為就是去計算,而且切換也是會有時間損耗)

#以下整體就是一個程序,這個程序包括了3個執行緒:一個主程序、兩個子程序
#程序是執行緒資源的集合
#程序和執行緒執行速度是一樣的,執行執行緒和執行程序是在執行同樣的東西
import time
import threading #多執行緒模組

#I/O密集型 適合用多執行緒 因為有阻塞,比如time.sleep(1)就是一個阻塞
# begin = time.time() #主執行緒
# def foo(a):
# print('foo:%s' %a)
# time.sleep(1) #睡1秒鐘 相當於I/O阻塞,那麼cpu切換到別的子執行緒中去執行,如果都阻塞住,那麼cpu就休息了

# print('end foo')
#
# def bar(a):
# print('bar:%s' %a)
# time.sleep(2) #睡1秒鐘 不佔用cpu
# print('end bar')
#
# t1 = threading.Thread(target=foo,args=(1,)) #建立了一個子執行緒物件t1,相當於foo(1)
# t1.start() #子執行緒執行
# t2 = threading.Thread(target=bar,args=(2,)) #建立了一個子執行緒物件t2,相當於bar(2)
# t2.start() #子執行緒執行

#
# end = time.time() #主執行緒
# print(end-begin) #列印程式執行的時間 #主執行緒
#子執行緒和主執行緒是並駕齊驅的,同時執行 誰快誰慢 是搶佔式的
#而子執行緒中的其餘的程式也是一起執行的,執行緒之間可以資料共享,程序不可以(但是可以通過佇列等進行通訊)

#Cpython中有一個直譯器鎖GIL,表示在同一時刻,只能有一個執行緒,如果有多個執行緒,那麼就會去競爭
#因為有了GIL,所以多核cpu也沒用了
#GIL是不讓一個程序中的多個執行緒同時跑,但是讓多個程序同時跑,每個程序分配每個cpu即可

# foo(1)
# bar(2) #這樣執行是序列執行程式碼
#並行是好幾個cpu同時在工作

#阻塞:比如上次的程式中的等待客戶端來連線服務端就是一個阻塞

#計算密集型 不適合用多執行緒 因為總是要執行完所有的計算過程的,而且計算過程肯定是沒有阻塞的
# begin = time.time()
def add(n):
sum = 0
for i in range(n):
sum += i
print(sum)
# add(1000000)
# add(2000000)
#
# end = time.time()
# print(end-begin)

begin = time.time()
t3 = threading.Thread(target=add,args=(1000000,))
t3.start()
t4 = threading.Thread(target=add,args=(2000000,))
t4.start()

end = time.time()
print(end-begin)

# 結論:在python中
# if 任務是IO密集型的 可以用多執行緒
# if 任務是計算密集型的 改用c語言

#join:誰呼叫join,誰就阻塞住,如t1.join()表示如果t1沒有執行完,其餘的誰也不能去執行,其實就是序列,沒有多大的意義
# for t in thread: #假如thread=[t1,t2]
# t.start()
# t.join() #不在for迴圈內時,這一句等價於t2.join()

#Daemon: t1.setDaemon(True)設定守護執行緒,只要是主執行緒結束了,那麼t1子執行緒也立馬結束,其餘執行緒正常執行

print(threading.current_thread()) #列印當前執行的執行緒
print(threading.active_count()) #列印沒有結束的執行緒

#注:Cpython是用c語言寫的python直譯器


圖 多程序解決Cpyton中的GIL問題

最近特別的想回家,不知道是為什麼,剛剛三點的時候和我妹妹微信語音了大概三十多分鐘,主要是給她說了一下這次期中考試的事情,別的順帶的問了一下,
知道我爸在幹什麼,我媽在幹什麼,就很知足了,最重要的是不想再讓我爸媽那麼的辛苦了;我知道最近家裡在蓋浴室,爸媽肯定都累壞了。

  我知道目前我還不是能夠讓我爸媽引以為豪的兒子,以後可能會慢慢標號的吧。
  現在在聽beyond的大地,其中有一句評論:我離天空最高的一次,是你把我高高的舉過了你的肩頭。
                                    haijing in HZ
                                    2018.11.18 週末 傍晚 雨