<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 431,  comments - 344,  trackbacks - 0
    我們在做軟件開發的時候很多要用到多線程技術。例如如果做一個下載軟件象flashget就要用到、象在線視頻工具realplayer也要用到因為要同時下載media stream還要播放。其實例子是很多的。

        線程相對進程來說是“輕量級”的,操作系統用較少的資源創建和管理線程。程序中的線程在相同的內存空間中執行,并共享許多相同的資源。

        在python中如何創建一個線程對象

        如果你要創建一個線程對象,很簡單,只要你的類繼承threading.Thread,然后在__init__里首先調用threading.Thread__init__方法即可

        import threading
        class mythread(threading.Thread):
            def __init__(self, threadname):
                threading.Thread.__init__(self, name = threadname)
            ....

        這才僅僅是個空線程,我可不是要他拉空車的,他可得給我干點實在活。很簡單,重寫類的run()方法即可,把你要在線程執行時做的事情都放到里面

        import threading
        import time
        class mythread(threading.Thread):
            def __init__(...):
                ....
            def run(self):
                for i in range(10):
                    print self.getName, i
                time.sleep(1)

        以上代碼我們讓這個線程在執行之后每隔1秒輸出一次信息到屏幕,10次后結束

        getName()threading.Thread類的一個方法,用來獲得這個線程對象的name。還有一個方法setName()當然就是來設置這個線程對象的name的了。

        如果要創建一個線程,首先就要先創建一個線程對象

        mythread1 = mythread('mythread 1')

        一個線程對象被創建后,他就處于“born”(誕生狀態)

        如何讓這個線程對象開始運行呢?只要調用線程對象的start()方法即可

        mythread1.start()

        現在線程就處于“ready”狀態或者也稱為“runnable”狀態。

        奇怪嗎?不是已經start了嗎?為什么不稱為“running”狀態呢?其實是有原因的。因為我們的計算機一般是不具有真正并行處理能力的。我們所謂的多線程只是把時間分成片段,然后隔一個時間段就讓一個線程執行一下,然后進入“sleeping ”狀態,然后喚醒另一個在“sleeping”的線程,如此循環runnable->sleeping->runnable... ,只是因為計算機執行速度很快,而時間片段間隔很小,我們感受不到,以為是同時進行的。所以說一個線程在start了之后只是處在了可以運行的狀態,他什么時候運行還是由系統來進行調度的。

        那一個線程什么時候會“dead”呢?一般來說當線程對象的run方法執行結束或者在執行中拋出異常的話,那么這個線程就會結束了。系統會自動對“dead”狀態線程進行清理。

        如果一個線程t1在執行的過程中需要等待另一個線程t2執行結束后才能運行的話那就可以在t1在調用t2join()方法

        ....
        def t1(...):
            ...
            t2.join()
            ...

        這樣t1在執行到t2.join()語句后就會等待t2結束后才會繼續運行。

        但是假如t1是個死循環的話那么等待就沒有意義了,那怎么辦呢?可以在調用t2join()方法的時候給一個浮點數做超時參數,這樣這個線程就不會等到花兒也謝了了。我等你10s,你不回來我還不允許我改嫁啊?:)

        def t1(...):
            ...
            t2.join(10)
            ...

        如果一個進程的主線程運行完畢而子線程還在執行的話,那么進程就不會退出,直到所有子線程結束為止,如何讓主線程結束的時候其他子線程也乖乖的跟老大撤退呢?那就要把那些不聽話的人設置為聽話的小弟,使用線程對象的setDaemon()方法,參數為bool型。True的話就代表你要聽話,我老大(主線程)扯呼,你也要跟著撤,不能拖后腿。如果是False的話就不用那么聽話了,老大允許你們將在外軍命有所不受的。需要注意的是setDaemon()方法必須在線程對象沒有調用start()方法之前調用,否則沒效果。

        t1 = mythread('t1')
        print t1.getName(),t1.isDaemon()
        t1.setDaemon(True)
        print t1.getName(),t1.isDaemon()
        t1.start()
        print 'main thread exit'

        當執行到 print 'main thread exit' 后,主線程就退出了,當然t1這個線程也跟著結束了。但是如果不使用t1線程對象的setDaemon()方法的話,即便主線程結束了,還要等待t1線程自己結束才能退出進程。isDaemon()是用來獲得一個線程對象的Daemonflag狀態的。

        如何來獲得與線程有關的信息呢?

        獲得當前正在運行的線程的引用

        running = threading.currentThread()

        獲得當前所有活動對象(即run方法開始但是未終止的任何線程)的一個列表

        threadlist = threading.enumerate()

        獲得這個列表的長度

        threadcount = threading.activeCount()

        查看一個線程對象的狀態調用這個線程對象的isAlive()方法,返回1代表處于“runnable”狀態且沒有“dead

        threadflag = threading.isAlive()

    posted on 2007-09-25 16:01 周銳 閱讀(521) 評論(0)  編輯  收藏 所屬分類: Python
    主站蜘蛛池模板: 国产天堂亚洲精品| 精品日韩亚洲AV无码| 亚洲无人区码一二三码区别图片 | 免费在线一级毛片| 亚洲av无码兔费综合| 国产精品四虎在线观看免费| 亚洲Aⅴ在线无码播放毛片一线天| 日韩成全视频观看免费观看高清| 亚洲精品久久无码| 四虎影视永久免费观看网址| 日韩在线一区二区三区免费视频 | 亚洲国产成人无码av在线播放| **实干一级毛片aa免费| 亚洲AV综合色区无码二区偷拍 | 免费国产成人高清视频网站| 精品亚洲福利一区二区| 亚洲片国产一区一级在线观看| 美女无遮挡拍拍拍免费视频| 国产亚洲?V无码?V男人的天堂 | 希望影院高清免费观看视频| 亚洲综合中文字幕无线码| 女人18毛片水真多免费播放| 高潮毛片无遮挡高清免费视频| 国产午夜亚洲精品理论片不卡| 久久不见久久见免费视频7| 亚洲国产成人久久| 亚洲精品一级无码中文字幕| 在线人成免费视频69国产| 亚洲精品在线网站| 国产免费爽爽视频免费可以看| 国产无限免费观看黄网站| 亚洲系列国产精品制服丝袜第| 成人免费看片又大又黄| jizz在线免费播放| 亚洲日产2021三区在线| 国产hs免费高清在线观看| 无码人妻久久一区二区三区免费 | 久久成人无码国产免费播放| 亚洲国产精品久久久久秋霞影院| 国产精品jizz在线观看免费| 国产无遮挡裸体免费视频在线观看 |