一、題目:
熟悉執行緒相關知識後,利用lock和rlock實現執行緒間的簡單同步,使得10個執行緒對同一共享變數進行遞增操作,使用加鎖機制保證變數結果的正確。
二、主要難點
1. 一般而言建立自己的執行緒類,可以重寫threading.thread類的方法
threading.thread類的使用:
i,在自己的執行緒類的__init__裡呼叫threading.thread.__init__(self, name = threadname),threadname為執行緒的名字
ii, run(),通常需要重寫,編寫**實現做需要的功能。
iii,getname(),獲得執行緒物件名稱
iv,setname(),設定執行緒物件名稱
v,start(),啟動執行緒
vi,jion([timeout]),等待另一線程結束後再執行。
vii,setdaemon(bool),設定子執行緒是否隨主線程一起結束,必須在start()之前呼叫。預設為false。
viii,isdaemon(),判斷執行緒是否隨主線程一起結束。
viiii,isalive(),檢查執行緒是否在執行中。
此外threading模組本身也提供了很多方法和其他的類,可以幫助我們更好的使用和管理執行緒。可以參看
2.執行緒同步方法
執行緒同步可以使用rlock鎖和event(訊號量)兩種種方法實現。
rlock的核心思想是在訪問時候對變數加鎖
event的核心思想是在把欲訪問的全域性變數放入臨界區,標誌被設定則不能訪問,阻塞程序,若標誌被清除則可以訪問,同時解放那些阻塞的程序。
三、實現**
用rlock實現:
#-*- coding:utf-8 -*-用event實現#filename:thread.py
#author:xue weiwei@ustc
#last-modify:2012-5-16
'''使用執行緒鎖機制使多個執行緒對乙個變數遞增
@note:python的多執行緒使用,rloc**程鎖的使用'''
from threading import thread
from threading import rlock
import time
class addthread(thread):
'''自定義執行緒類,方便使用,實現多個執行緒訪問乙個變數的作用
'''def __init__(self,threadname):
thread.__init__(self,name=threadname)
def run(self):
'''run函式中寫下具體執行緒實現功能,這裡是實現全域性變數遞增的操作
@note: 用lock
'''global share_val
lock.acquire()
share_val+=1
print share_val
lock.release()
return 0
if __name__=='__main__':
share_val=0
lock=rlock()
threadlist=
begin=time.time()
for i in range(10):
temp = addthread("thread%d"%i)
for eachthread in threadlist:
eachthread.start()
for eachthread in threadlist: #所有執行緒退出,否則程式不會結束
eachthread.join()
print "use %s s"%(time.time()-begin)
(因為原理大體相同,就沒有自己寫,引用自
#coding:utf-8四、參考資料'''cdays+3-exercise-3.py 使用thread和event實現簡單的執行緒間通訊
@see: event(
@author: u
@version:$id$
'''from threading import thread
from threading import event
import time
class mythread(thread):
'''mythread
自定義執行緒
'''def __init__(self, threadname):
thread.__init__(self, name = threadname)
def run(self):
global event
global share_var
if event.isset(): #判斷event的訊號標誌
event.clear() #若設定了,則清除
event.wait() #並呼叫wait方法
#time.sleep(2)
share_var += 1 #修改共享變數
print '%s ==> %d' % (self.getname(), share_var)
else:
share_var += 1 #未設定,則直接修改
print '%s ==> %d' % (self.getname(), share_var)
#time.sleep(1)
event.set() #設定訊號標誌
if __name__ == "__main__":
share_var = 0
event = event() #建立event物件
event.set() #設定內部訊號標誌為真
threadlist =
for i in range(10): #建立10個執行緒
my = mythread('thread%d' % i)
for i in threadlist: #開啟10個執行緒
i.start()
print "%s start\n"%i.getname()
1.2.
多執行緒 相關知識
多執行緒 目標程序 執行緒程序 對應的就是計算機中執行的應用程式 process p new process p.startinfo.filename notepad.exe p.start 通過例項物件來開啟記事本 process ps process.getprocesses foreach p...
多執行緒知識學習
我們現在寫乙個買票的多執行緒。例子 public class sellticket implements runnable catch interruptedexception e system.out.println thread.currentthread getname 正在銷售第 ticke...
C 多執行緒 非同步執行緒 執行緒池相關知識
執行緒池threadpool類會在需要時增減池中線程的執行緒數,直到最大的執行緒數。池中的最大執行緒數是可配置的。在雙核cpu中,預設設定為1023個工作執行緒和1000個i o執行緒。也可以指定在建立執行緒池時應立即啟動的最小執行緒數,以及執行緒池,中可用的最大執行緒數。如果有更多的作業要處理,執...