【Python】批量建立執行緒
阿新 • • 發佈:2019-02-11
在《【Python】執行緒的建立、執行、互斥、同步、銷燬》(點選開啟連結)中介紹了Python中執行緒的使用,但是裡面執行緒的建立,使用了很原始的方式,一行程式碼建立一條。其實,Python裡是可以批量建立執行緒的。利用Python批量建立執行緒可以將之前的程式優化,具體請看如下的程式碼:
# -*-coding:utf-8-*- import threading; mutex_lock = threading.RLock(); # 互斥鎖的宣告 ticket = 100000; # 總票數 # 用於統計各個執行緒的得票數 ticket_stastics=[]; class myThread(threading.Thread): # 執行緒處理函式 def __init__(self, name): threading.Thread.__init__(self); # 執行緒類必須的初始化 self.thread_name = name; # 將傳遞過來的name構造到類中的name def run(self): # 宣告在類中使用全域性變數 global mutex_lock; global ticket; while 1: mutex_lock.acquire(); # 臨界區開始,互斥的開始 # 僅能有一個執行緒↓↓↓↓↓↓↓↓↓↓↓↓ if ticket > 0: ticket -= 1; # 統計哪到執行緒拿到票 print "執行緒%s搶到了票!票還剩餘:%d。" % (self.thread_name, ticket); ticket_stastics[self.thread_name]+=1; else: break; # 僅能有一個執行緒↑↑↑↑↑↑↑↑↑↑↑↑ mutex_lock.release(); # 臨界區結束,互斥的結束 mutex_lock.release(); # python線上程死亡的時候,不會清理已存在線上程函式的互斥鎖,必須程式猿自己主動清理 print "%s被銷燬了!" % (self.thread_name); # 初始化執行緒 threads = [];#存放執行緒的陣列,相當於執行緒池 for i in range(0,5): thread = myThread(i);#指定執行緒i的執行函式為myThread threads.append(thread);#先講這個執行緒放到執行緒threads ticket_stastics.append(0);# 初始化執行緒的得票數統計陣列 for t in threads:#讓執行緒池中的所有陣列開始 t.start(); for t in threads: t.join();#等待所有執行緒執行完畢才執行一下的程式碼 print "票都搶光了,大家都散了吧!"; print "=========得票統計========="; for i in range(0,len(ticket_stastics)): print "執行緒%d:%d張" % (i,ticket_stastics[i]);
執行結果還是原來的功能:
但是,這裡利用了一個數組和for迴圈建立執行緒,先遍歷建立一堆執行緒放到執行緒池threads裡面,實質上所謂的“執行緒池”也就是存放執行緒的陣列,再用一個for迴圈,讓這個執行緒池threads裡面的執行緒全部開始。
待所有執行緒開始之後,再讓主執行緒,也就是整個主程式,等待所有子執行緒thread結束才執行下面的程式碼。# 初始化執行緒 threads = [];#存放執行緒的陣列,相當於執行緒池 for i in range(0,5): thread = myThread(i);#指定執行緒i的執行函式為myThread threads.append(thread);#先講這個執行緒放到執行緒threads for t in threads:#讓執行緒池中的所有陣列開始 t.start(); for t in threads: t.join();#等待所有執行緒執行完畢才執行一下的程式碼
這裡不能寫成如下的程式碼段:
for t in threads:#讓執行緒池中的所有陣列開始
t.start();
t.join();#等待所有執行緒執行完畢才執行一下的程式碼
這樣的話,主程式會等待執行緒0,跑完myThread中的所有程式碼,才去建立執行緒1,2,3.....的,這樣達不到執行緒併發的目的,程式變成單執行緒執行了,這是批量建立執行緒需要注意的地方。