1. 程式人生 > >網路程式設計 之執行緒

網路程式設計 之執行緒

# 程序都預設擁有一條主執行緒,執行緒相當於流水線,程序相當於車間.
#什麼是執行緒:程式的執行線路,相當於一條流水線,其包含了程式的具體執行步驟.
# 程序中包含了執行該程式需要的所有資源,程序是資源單位,執行緒是cpu的最小執行單位
# 程序包含執行緒而執行緒依賴於程序
# 程序對系統的資源消耗非常的高
# 多執行緒可以讓cpu在一個程序內切換,從而提高cpu佔用率

二 .開啟多執行緒的兩種方式 對比多程序實際是一樣的方式
1.例項化Thread
2.繼承Thread類 覆蓋 run方法
from threading import Thread
def task():
  print('threading running')
t1 = Thread(target = task,)
t1.staet()
print('over')

第二:繼承
class MyThread(Thread):
  def run(self):
    print('子執行緒running')
MyThread().start()
print('over')

三:
什麼情況下開啟多執行緒
當程式中遇到IO操作的時候
當程式中是純計算任務,即使開多執行緒也無法提高效率
程序和執行緒的區別:
1.所有的同一個程序內的執行緒共享這個程序中的所有資料資源
2.程序對於作業系統的資源消耗非常高,而執行緒比較低大概的倍數10-100倍
例子:
100個執行緒和100個程序開啟時間的對比:
from multiprocessing import Process
from threading import Thread
import time
def task():
    pass

100個程序時間統計
if __name__ == '__main__':
    start= time.time()
    ps=[]
    for i in range(100):
        p = Process(target=task)
        p.start()
        ps.append(p)
    for p in ps:
        p.join()

    
print(time.time()-start) 100個執行緒時間 start= time.time() ts = [] for i in range(100): t = Thread(target=task) t.start() ts.append(t) for t in ts: t.join() print(time.time()-start)

執行緒中的一些常規使用屬性 

# from threading import enumerate,current_thread,active_count
# 獲取所有執行緒物件列表 print(enumerate())
# 獲取當前執行緒 print(current_thread())
# 獲取當前正在進行的執行緒個數 print(active_count())

四:執行緒互斥鎖
import time
from threading import  Thread,Lock
lock = Lock()
a =100
def task():
    lock.acquire()
    global a
    temp = a - 1
    time.sleep(0.01)
    a = temp
    lock.release()
ts = []
for i in range(100):
    t = Thread(target=task)
    t.start()
    ts.append(t)   將程序物件加入列表
for t in ts :      迴圈列表中的程序為其新增join 讓主執行緒等待其他子執行緒全部執行完後再執行
    t.join()
print(a)

五.訊號量 

其實也是一種鎖,特點是可以設定一個數據被多個執行緒(程序共享)

對比普通鎖的區別:

普通鎖: 一旦加鎖則意味著.這個資料只能被同時一個人使用,訊號量可以在同一個時間被多個執行緒使用

作用可以防止資料被同時訪問過載,限制訪問的執行緒個數

 
 
 
from threading import  Semaphore,Thread,current_thread
import time,random
sem = Semaphore(3)   #設定同時可以多少個執行緒訪問資料執行

def task():
    sem.acquire()
    print('%s run.....'%current_thread())
    time.sleep(3)    #3個執行緒一批的執行 
    sem.release()
for i in range(10):
    t = Thread(target=task)
    t.start()