python中threading的用法

來源:互聯網
上載者:User

標籤:

摘自:http://blog.chinaunix.net/uid-27571599-id-3484048.html

以及:http://blog.chinaunix.net/uid-11131943-id-2906286.html

threading提供了一個比thread模組更高層的API來提供線程的並發性。這些線程並發運行並共用記憶體。 

        下面來看threading模組的具體用法: 

 

     一、Thread的使用 目標函數可以執行個體化一個Thread對象,每個Thread對象代表著一個線程,可以通過start()方法,開始運行。

     這裡對使用多線程並發,和不適用多線程並發做了一個比較:

首先是不使用多線程的操作:

代碼如下:

 

 
123456789101112 #!/usr/bin/python#compare for multi threadsimport time def worker():    print "worker"    time.sleep(1)    return if __name__ == "__main__":    for i in xrange(5):        worker()

 

執行結果如下:

   

下面是使用多線程並發的操作:

代碼如下:

 

 
123456789101112 #!/usr/bin/pythonimport threadingimport time def worker():    print "worker"    time.sleep(1)    return for i in xrange(5):    t = threading.Thread(target=worker)    t.start()

 

可以明顯看出使用了多線程並發的操作,花費時間要短的很多。

 

二、threading.activeCount()的使用,此方法返回當前進程中線程的個數。返回的個數中包含主線程。

代碼如下:

 

 
1234567891011121314 #!/usr/bin/python#current‘s number of threadsimport threadingimport time def worker():    print "test"    time.sleep(1) for i in xrange(5):    t = threading.Thread(target=worker)    t.start() print "current has %d threads" % (threading.activeCount() - 1)

 

 

三、threading.enumerate()的使用。此方法返回當前運行中的Thread對象列表。

代碼如下:

 

 
12345678910111213141516171819202122 #!/usr/bin/python#test the variable threading.enumerate()import threadingimport time def worker():    print "test"    time.sleep(2) threads = []for i in xrange(5):    t = threading.Thread(target=worker)    threads.append(t)    t.start() for item in threading.enumerate():    print item print for item in threads:    print item

 

 

四、threading.setDaemon()的使用。設定後台進程。

代碼如下:

 

 
12345678910111213 #!/usr/bin/python#create a daemonimport threadingimport time def worker():    time.sleep(3)    print "worker" t=threading.Thread(target=worker)t.setDaemon(True)t.start()print "haha"

 

可以看出worker()方法中的列印操作並沒有顯示出來,說明已經成為後台進程。

 

python線程 threading.Thread 條件變數 同步線程 

在用python的threading.Thread編寫多線程程式時,最簡單的就是是用鎖,為使線程之間保持同步,可以使用threading.Condition() 條件變數

思路:

1.分析哪一塊空間需要多線程讀寫,抽象出一個共用空間類,對共用空間設定讀方法(get)和寫方法(set)

2.為使讀線程和寫線程同步,可以用threading.Condition()產生一個條件,同一個條件有wait()和notify()
notifyAll()方法,wait使線程自己進入block(阻塞)狀態,一個線程的notify可以使同一個條件變數中block
的線程得到啟動並執行機會。notifyAll通知所有被阻塞的線程進入runnable狀態。

3.所有對共用空間操作的方法(read or write)都封閉在acquire()和release()中間

========以下執行個體簡單明了==================

 

#coding=utf-8
#file name is maker.py

import threading
import random,time

class Maker(threading.Thread):
    
    def __init__(self,threadName,shareObject):
        threading.Thread.__init__(self,name=threadName)
        self.shareObject=shareObject
        
    def run(self):
        for x in range(1,5):
            time.sleep(random.randrange(1,4))
            self.shareObject.set(x)
            print "%s threading write %d" %(threading.currentThread().getName(),x)

 

=============================================================================


 

#coding=utf-8
#file name is user.py

import threading
import time,random

class User(threading.Thread):
    
    def __init__(self,threadName,shareObject):
        threading.Thread.__init__(self,name=threadName)
        self.shareObject=shareObject
        self.sum=0
        
    def run(self):
        for x in range(1,5):
            time.sleep(random.randrange(1,4))
            tempNum=self.shareObject.get()
            print "%s threading read %d" %(threading.currentThread().getName(),tempNum)
            self.sum=self.sum+tempNum
            
    def display(self):
        print "sum is %d" %(self.sum)


 

=============================================================================

 

#coding=utf-8
#file name is shareInt.py

import threading
import time,random

class ShareInt():
    
    def __init__(self):
        self.threadCondition=threading.Condition()
        self.shareObject=[]
        
        
    #所有對共用空間操作的方法(read or write)都封閉在acquire()和release()中間
    def set(self,num):
        self.threadCondition.acquire() # 在調用一個讀或者寫共用空間的方法時,需要先拿到一個基本鎖
                                                          # 基本鎖的獲得採用競爭機制,無法判斷哪個線程會先運行
                                                  # 不拿基本鎖會出現執行階段錯誤:cannot notify on un-aquired lock
        
        if len(self.shareObject)!=0:
            print "%s threading try write! But shareObject is full" %(threading.currentThread().getName())
            self.threadCondition.wait() # 在條件滿足的情況下,會block掉調用這個方法的線程
                               # 這裡使用while語句更好,因為block在這個位置後,
                               # 當再次運行此線程的時候,會從頭再一次檢查條件。
        
        self.shareObject.append(num)
        
        self.threadCondition.notify() # 一定要先調用notify()方法,在release()釋放基本鎖
        self.threadCondition.release() # 可以理解為"通知"被wait的線程進入runnable狀態,然後在它獲得鎖後開始運行
                                                          # 最後一定要release()釋放鎖,否則會導致死結
                                         
    def get(self):
        self.threadCondition.acquire()
        
        if len(self.shareObject)==0:
            print "%s threading try read! But shareObject is empty" %(threading.currentThread().getName())
            self.threadCondition.wait()
            
        tempNum=self.shareObject[0]
        self.shareObject.remove(tempNum)
        self.threadCondition.notify()
        self.threadCondition.release()
        return tempNum

 

==============================測試代碼===============================


 

#coding=utf-8
#file name is Test.py

from user import User
from maker import Maker
from shareInt import ShareInt

shareObject=ShareInt()
user1=User("user1",shareObject)
maker1=Maker("maker1",shareObject)

user1.start()
maker1.start()

user1.join()
maker1.join()

user1.display()

print "main threading over!"

 

python中threading的用法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.