中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

python多線程用法實例詳解
來源:易賢網 閱讀:1376 次 日期:2015-01-16 13:58:30
溫馨提示:易賢網小編為您整理了“python多線程用法實例詳解”,方便廣大網友查閱!

本文實例分析了python多線程用法。分享給大家供大家參考。具體如下:

今天在學習嘗試學習python多線程的時候,突然發現自己一直對super的用法不是很清楚,所以先總結一些遇到的問題。當我嘗試編寫下面的代碼的時候:

復制代碼 代碼如下:class A():

def __init__( self ):

print "A"

class B( A ):

def __init__( self ):

super( B, self ).__init__( )

# A.__init__( self )

print "B"

b = B()

出現:

super( B, self ).__init__()

TypeError: must be type, not classobj

最后發現原來是python中的新式類的問題,也就是A必須是新式類。解決方法如下兩種:

(1)

復制代碼 代碼如下:class A( object ):

def __init__( self ):

print "A"

class B( A ):

def __init__( self ):

super( B, self ).__init__( )

# A.__init__( self ) ##這條語句是舊式的,存在潛在的問題,應該避免使用

print "B"

b = B()

(2)

復制代碼 代碼如下:__metaclass__=type

class A():

def __init__( self ):

print "A"

class B( A ):

def __init__( self ):

super( B, self ).__init__( )

# A.__init__( self ) ##這條語句是舊式的,存在潛在的問題,應該避免使用

print "B"

b = B()

注意:如果在super( B, self ).__init__( )

語句中添加self,也就是super( B, self ).__init__( self ),會出現如下的錯誤:

super( B, self ).__init__( self )

TypeError: __init__() takes exactly 1 argument (2 given)

以上只是一點點本人的心得筆記,呵呵。

復制代碼 代碼如下:import threading, time

class myThread( threading.Thread ):

def __init__( self, threadname = "" ):

#threading.Thread.__init__( self, name = threadname )

super( myThread, self ).__init__( name = threadname )

def run( self ):

print "starting====", self.name, time.ctime()

time.sleep( 5 )

print "end====", self.name, time.ctime(),

m = myThread( "m" )

n = myThread( "n" )

m.start()

n.start()

輸出的結果:

starting==== m Mon Aug 08 21:55:41 2011

starting==== n Mon Aug 08 21:55:41 2011

如果一個進程的主線程運行完畢而子線程還在執行的話,那么進程就不會退出,直到所有子線程結束為止。比如下面的例子:

復制代碼 代碼如下:import threading, time

class myThread( threading.Thread ):

def __init__( self, threadname = "" ):

#threading.Thread.__init__( self, name = threadname )

super( myThread, self ).__init__( name = threadname )

def run( self ):

print "starting====", self.name, time.ctime()

time.sleep( 5 )

print "end====", self.name, time.ctime(),

m = myThread( "m" )

m.start()

print "main end"

print

輸出的結果為:

starting==== m Mon Aug 08 22:01:06 2011

main end

end==== m Mon Aug 08 22:01:11 2011

也就是主進程結束之后,子進程還沒有結束

如果我們想在主進程結束的時候,子進程也結束的話,我們就應該使用setDaemon()函數。

實例如下:

復制代碼 代碼如下:import threading, time

class myThread( threading.Thread ):

def __init__( self, threadname = "" ):

#threading.Thread.__init__( self, name = threadname )

super( myThread, self ).__init__( name = threadname )

def run( self ):

print "starting====", self.name, time.ctime()

time.sleep( 5 )

print "end====", self.name, time.ctime(),

m = myThread( "m" )

m.setDaemon( True )

m.start()

print "main end"

print

輸出的結果為:starting====main end m Mon Aug 08 22:02:58 2011

可以看出,并沒有打印出子進程m結束的時候本應該打印的“end===…”

簡單的線程同步

個執行線程經常要共享數據,如果僅僅讀取共享數據還好,但是如果多個線程要修改共享數據的話就可能出現無法預料的結果。

假如兩個線程對象t1和t2都要對數值num=0進行增1運算,那么t1和t2都各對num修改10次的話,那么num最終的結果應該為20。但是如果當t1取得num的值時(假如此時num為0),系統把t1調度為“sleeping”狀態,而此時t2轉換為“running”狀態,此時t2獲得的num的值也為0,然后他把num+1的值1賦給num。系統又把t2轉化為“sleeping”狀態,t1為“running”狀態,由于t1已經得到num值為0,所以他也把num+1的值賦給了num為1。本來是2次增1運行,結果卻是num只增了1次。類似這樣的情況在多線程同時執行的時候是有可能發生的。所以為了防止這類情況的出現就要使用線程同步機制。

最簡單的同步機制就是“鎖”

鎖對象用threading.RLock類創建

復制代碼 代碼如下:mylock = threading.RLock()

如何使用鎖來同步線程呢?線程可以使用鎖的acquire() (獲得)方法,這樣鎖就進入“locked”狀態。每次只有一個線程可以獲得鎖。如果當另一個線程試圖獲得這個鎖的時候,就會被系統變為“blocked”狀態,直到那個擁有鎖的線程調用鎖的release() (釋放)方法,這樣鎖就會進入“unlocked”狀態。“blocked”狀態的線程就會收到一個通知,并有權利獲得鎖。如果多個線程處于“blocked”狀態,所有線程都會先解除“blocked”狀態,然后系統選擇一個線程來獲得鎖,其他的線程繼續沉默(“blocked”)。

復制代碼 代碼如下:import threading

mylock = threading.RLock()

class mythread(threading.Thread)

...

def run(self ...):

... #此處 不可以 放置修改共享數據的代碼

mylock.acquire()

... #此處 可以 放置修改共享數據的代碼

mylock.release()

... #此處 不可以 放置修改共享數據的代碼

我們把修改共享數據的代碼稱為“臨界區”,必須將所有“臨界區”都封閉在同一鎖對象的acquire()和release()方法調用之間。

鎖只能提供最基本的同步級別。有時需要更復雜的線程同步,例如只在發生某些事件時才訪問一個臨界區(例如當某個數值改變時)。這就要使用“條件變量”。

條件變量用threading.Condition類創建

復制代碼 代碼如下:mycondition = threading.Condition()

條件變量是如何工作的呢?首先一個線程成功獲得一個條件變量后,調用此條件變量的wait()方法會導致這個線程釋放這個鎖,并進入“blocked”狀態,直到另一個線程調用同一個條件變量的notify()方法來喚醒那個進入“blocked”狀態的線程。如果調用這個條件變量的notifyAll()方法的話就會喚醒所有的在等待的線程。

如果程序或者線程永遠處于“blocked”狀態的話,就會發生死鎖。所以如果使用了鎖、條件變量等同步機制的話,一定要注意仔細檢查,防止死鎖情況的發生。對于可能產生異常的臨界區要使用異常處理機制中的finally子句來保證釋放鎖。等待一個條件變量的線程必須用notify()方法顯式的喚醒,否則就永遠沉默。保證每一個wait()方法調用都有一個相對應的notify()調用,當然也可以調用notifyAll()方法以防萬一。

同步隊列

我們經常會采用生產者/消費者關系的兩個線程來處理一個共享緩沖區的數據。例如一個生產者線程接受用戶數據放入一個共享緩沖區里,等待一個消費者線程對數據取出處理。但是如果緩沖區的太小而生產者和消費者兩個異步線程的速度不同時,容易出現一個線程等待另一個情況。為了盡可能的縮短共享資源并以相同速度工作的各線程的等待時間,我們可以使用一個“隊列”來提供額外的緩沖區。

創建一個“隊列”對象,可以使用如下代碼:

復制代碼 代碼如下:import Queue

myqueue = Queue.Queue(maxsize = 10)

Queue.Queue類即是一個隊列的同步實現。隊列長度可為無限或者有限。可通過Queue的構造函數的可選參數maxsize來設定隊列長度。如果maxsize小于1就表示隊列長度無限。

將一個值放入隊列中:

myqueue.put(10)

調用隊列對象的put()方法在隊尾插入一個項目。put()有兩個參數,第一個item為必需的,為插入項目的值;第二個block為可選參數,默認為1。如果隊列當前為空且block為1,put()方法就使調用線程暫停,直到空出一個數據單元。如果block為0,put方法將引發Full異常。

將一個值從隊列中取出:

myqueue.get()

調用隊列對象的get()方法從隊頭刪除并返回一個項目。可選參數為block,默認為1。如果隊列為空且block為1,get()就使調用線程暫停,直至有項目可用。如果block為0,隊列將引發Empty異常。

我們用一個例子來展示如何使用Queue:

復制代碼 代碼如下:# queue_example.py

from Queue import Queue

import threading

import random

import time

# Producer thread

class Producer( threading.Thread ):

def __init__( self, threadname, queue ):

threading.Thread.__init__( self, name = threadname )

self.sharedata = queue

def run( self ):

for i in range( 20 ):

print self.getName(), 'adding', i, 'to queue'

self.sharedata.put( i )

time.sleep( random.randrange( 10 ) / 10.0 )

print self.getName(), 'Finished'

# Consumer thread

class Consumer( threading.Thread ):

def __init__( self, threadname, queue ):

threading.Thread.__init__( self, name = threadname )

self.sharedata = queue

def run( self ):

for i in range( 20 ):

print self.getName(), 'got a value:', self.sharedata.get()

time.sleep( random.randrange( 10 ) / 10.0 )

print self.getName(), 'Finished'

# Main thread

def main():

queue = Queue()

producer = Producer( 'Producer', queue )

consumer = Consumer( 'Consumer', queue )

print 'Starting threads ...'

producer.start()

consumer.start()

producer.join()

consumer.join()

print 'All threads have terminated.'

if __name__ == '__main__':

main()

程序輸出的結果為:

Starting threads ...

Producer adding 0 to queue

Consumer got a value: 0

Producer Finished

Producer adding 1 to queue

Producer Finished

Producer adding 2 to queue

Consumer Finished

Consumer got a value: 1

Consumer Finished

Consumer got a value: 2

Consumer Finished

Consumer got a value: Producer Finished

Producer adding 3 to queue

3

Consumer Finished

Consumer got a value: Producer Finished

Producer adding 4 to queue

4

ConsumerProducer Finished

ConsumerFinished

got a value:Producer adding 5 to queue

5

Consumer Finished

Consumer got a value: Producer Finished

Producer adding 6 to queue

Producer Finished

Producer adding 7 to queue

6

Consumer Finished

Consumer got a value: 7

Producer Finished

Producer adding 8 to queue

Producer Finished

Producer adding 9 to queue

Consumer Finished

Consumer got a value: 8

ConsumerProducer FinishedFinished

ConsumerProducer got a value:adding 109

to queue

Producer Finished

Producer adding 11 to queue

Producer Finished

Producer adding 12 to queue

ConsumerProducer FinishedFinished

ConsumerProducer got a value:adding 1310

to queue

Producer Finished

Producer adding 14 to queue

Consumer Finished

Consumer got a value: 11

Producer Finished

Producer adding 15 to queue

Producer Finished

Producer adding 16 to queue

Producer Finished

Producer adding 17 to queue

Producer Finished

Producer adding 18 to queue

Consumer Finished

Consumer got a value: 12

Producer Finished

Producer adding 19 to queue

Producer Finished

Consumer Finished

Consumer got a value: 13

Consumer Finished

Consumer got a value: 14

Consumer Finished

Consumer got a value: 15

Consumer Finished

Consumer got a value: 16

Consumer Finished

Consumer got a value: 17

Consumer Finished

Consumer got a value: 18

Consumer Finished

Consumer got a value: 19

Consumer Finished

All threads have terminated.

希望本文所述對大家的Python程序設計有所幫助。

更多信息請查看IT技術專欄

更多信息請查看腳本欄目
易賢網手機網站地址:python多線程用法實例詳解
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
国产精品一区二区久激情瑜伽| 亚洲伦伦在线| 影音先锋久久| 欧美成人国产| 1769国产精品| 老司机午夜精品视频| 欧美性一二三区| 亚洲欧美另类在线| 在线观看视频免费一区二区三区| 欧美精品久久一区二区| 新片速递亚洲合集欧美合集| 国产精品夜夜嗨| 欧美激情精品久久久久久大尺度 | 老司机精品视频网站| 亚洲三级毛片| 国产综合欧美在线看| 欧美日韩国产丝袜另类| 久久免费少妇高潮久久精品99| 精品成人一区二区| 欧美大片91| 久久亚洲一区| 亚洲一级黄色片| 亚洲第一综合天堂另类专| 欧美日韩三级电影在线| 久久黄金**| 亚洲欧美日本视频在线观看| 一区二区三区亚洲| 久久影音先锋| 亚洲一区欧美二区| 亚洲图色在线| 亚洲国产欧美在线人成| 黄色亚洲免费| 伊人久久婷婷| 亚洲国产一区二区在线| 国产精品一区二区在线观看| 老牛嫩草一区二区三区日本| 亚洲免费综合| 亚洲精选在线观看| 在线观看国产日韩| 亚洲精品一区中文| 亚洲专区一二三| 亚洲午夜免费视频| 午夜久久久久久| 欧美一区日本一区韩国一区| 亚洲欧美日韩成人高清在线一区| 亚洲午夜极品| 久久亚洲不卡| 国产精品福利片| 亚洲第一色在线| 中文在线不卡| 久久国产精品久久久| 另类春色校园亚洲| 欧美午夜精品久久久久免费视| 国产农村妇女精品| 亚洲黄色高清| 久久久久99| 国产精品免费一区二区三区在线观看 | 欧美日韩一区二区三区在线视频| 国产精品v欧美精品v日韩精品| 国产久一道中文一区| 午夜日韩激情| 欧美一区二区三区婷婷月色| 国产精品亚洲成人| 这里只有视频精品| 欧美激情精品久久久六区热门| 韩国成人福利片在线播放| 亚洲一级高清| 国产精品视频999| 中文精品视频| 欧美日韩视频专区在线播放| 在线免费观看日本欧美| 老鸭窝亚洲一区二区三区| 国产精品一区二区三区久久久 | 亚洲精品资源美女情侣酒店| 伊人久久男人天堂| 欧美jizz19性欧美| 在线观看视频一区二区欧美日韩| 欧美综合激情网| 国产一区二区三区在线播放免费观看| 亚洲一区二区三区精品视频 | 欧美一级一区| 国产区在线观看成人精品| 欧美承认网站| 亚洲美女中文字幕| 国产精品久久久久毛片软件| 亚洲伊人一本大道中文字幕| 国产日韩一级二级三级| 久久一区视频| 一区二区三区福利| 国内视频精品| 欧美黄色免费网站| 欧美一区二区三区精品| 亚洲精品一区二| 国产精品免费区二区三区观看| 亚洲午夜免费视频| 国产午夜精品久久久| 久久亚洲国产精品日日av夜夜| 日韩视频免费大全中文字幕| 国产精品五区| 欧美日韩国产精品专区| 欧美影院一区| 亚洲一区免费| 亚洲精品视频中文字幕| 国产日产欧美精品| 欧美三级电影一区| 欧美va天堂在线| 久久精品日产第一区二区三区 | 国产一区二区高清| 欧美天堂亚洲电影院在线播放| 久久久久久亚洲精品不卡4k岛国| 亚洲经典在线看| 国产欧美一区二区三区另类精品| 欧美精品一区二区三区视频| 性欧美xxxx视频在线观看| 亚洲精选成人| 亚洲乱码精品一二三四区日韩在线| 国产亚洲视频在线观看| 国产精品视频内| 国产精品分类| 国产欧美一区二区三区在线看蜜臀| 欧美大秀在线观看| 欧美成人精品在线视频| 国产精品日韩专区| 欧美日韩国产欧| 国产精品扒开腿做爽爽爽软件| 欧美日本簧片| 欧美色图天堂网| 国产精品xvideos88| 国产精品视频xxx| 亚洲午夜精品| av成人福利| 亚洲精品日韩激情在线电影| 狠狠色狠狠色综合日日小说| 国产综合在线视频| 在线观看亚洲专区| 亚洲欧洲日产国产综合网| 亚洲黄色成人网| 亚洲精选一区| 亚洲欧美怡红院| 久久久久在线观看| 欧美在线免费观看视频| 欧美黑人国产人伦爽爽爽| 国产精品久久久久影院亚瑟 | 韩国美女久久| 亚洲日本欧美日韩高观看| 亚洲视频中文| 免费成人高清视频| 国产精品国产自产拍高清av| 国内精品久久久久久| 在线观看一区二区视频| 亚洲影院污污.| 久久嫩草精品久久久精品| 欧美日韩播放| 精品成人一区二区三区四区| 日韩视频一区二区三区在线播放免费观看| 亚洲午夜精品17c| 亚洲先锋成人| 久久久人成影片一区二区三区| 欧美 日韩 国产在线| 国产精品亚洲综合久久| 亚洲韩国日本中文字幕| 日韩午夜中文字幕| 美女主播精品视频一二三四| 国产精品久久九九| 日韩亚洲欧美一区二区三区| 午夜在线不卡| 欧美午夜视频网站| 99re热这里只有精品免费视频| 久久资源在线| 国产专区精品视频| 亚洲一区三区视频在线观看| 免费试看一区| 亚洲精品国产精品国自产观看 | 国产精品三区www17con| 国语自产精品视频在线看| 国内成+人亚洲| 麻豆成人在线观看| 亚洲国产精品久久| 欧美日韩国产不卡| 亚洲欧美成人精品| 国产精品制服诱惑| 麻豆精品在线观看| 亚洲精品中文在线| 国产亚洲欧美一区| 国内自拍亚洲| 亚洲一区二区三区视频播放| 久久久亚洲精品一区二区三区| 欧美日韩国产首页| 夜夜嗨av一区二区三区网页| 亚洲国内精品| 亚洲美女视频在线免费观看| 亚洲美女少妇无套啪啪呻吟| 亚洲第一区在线观看| 久久久精品性| 欧美三级网址| 欧美成人激情在线| 久久免费视频在线观看| 欧美一区1区三区3区公司| 亚洲一区网站| 在线综合+亚洲+欧美中文字幕|