1. 程式人生 > >【Python】批量建立執行緒

【Python】批量建立執行緒

在《【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裡面的執行緒全部開始。

# 初始化執行緒 
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();#等待所有執行緒執行完畢才執行一下的程式碼
待所有執行緒開始之後,再讓主執行緒,也就是整個主程式,等待所有子執行緒thread結束才執行下面的程式碼。

這裡不能寫成如下的程式碼段:

for t in threads:#讓執行緒池中的所有陣列開始
    t.start();
    t.join();#等待所有執行緒執行完畢才執行一下的程式碼
這樣的話,主程式會等待執行緒0,跑完myThread中的所有程式碼,才去建立執行緒1,2,3.....的,這樣達不到執行緒併發的目的,程式變成單執行緒執行了,這是批量建立執行緒需要注意的地方。