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.....的,這樣達不到線程并發的目的,程序變成單線程執行了,這是批量創建線程需要注意的地方。
總結
以上是生活随笔為你收集整理的python 批量创建线程_【Python】批量创建线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql的三大特性_【mysql】In
- 下一篇: ext springmvc mysql_