python學習 多執行緒相關知識

2022-04-28 11:27:03 字數 3031 閱讀 4212

一、題目:

熟悉執行緒相關知識後,利用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 -*-

#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)

用event實現

(因為原理大體相同,就沒有自己寫,引用自

#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執行緒。也可以指定在建立執行緒池時應立即啟動的最小執行緒數,以及執行緒池,中可用的最大執行緒數。如果有更多的作業要處理,執...