最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中嘗試多線程編程的一個簡明例子

 更新時間:2015年04月07日 15:35:41   投稿:goldensun  
這篇文章主要介紹了Python中嘗試多線程編程的一個簡明例子,由于GIL的存在,Python中的多線程編程一個是熱點和難點問題,需要的朋友可以參考下

綜述
    多線程是程序設(shè)計中的一個重要方面,尤其是在服務(wù)器Deamon程序方面。無論何種系統(tǒng),線程調(diào)度的開銷都比傳統(tǒng)的進程要快得多。
  Python可以方便地支持多線程。可以快速創(chuàng)建線程、互斥鎖、信號量等等元素,支持線程讀寫同步互斥。美中不足的是,Python的運行在Python 虛擬機上,創(chuàng)建的多線程可能是虛擬的線程,需要由Python虛擬機來輪詢調(diào)度,這大大降低了Python多線程的可用性。希望高版本的Python可以 解決這個問題,發(fā)揮多CPU的最大效率。
  網(wǎng)上有些朋友說要獲得真正多CPU的好處,有兩種方法:
  1.可以創(chuàng)建多個進程而不是線程,進程數(shù)和cpu一樣多。
  2.使用Jython 或 IronPython,可以得到真正的多線程。
  閑話少說,下面看看Python如何建立線程
  Python線程創(chuàng)建
  使用threading模塊的 Thread類
  類接口如下

復(fù)制代碼 代碼如下:
class  Thread( group=None, target=None, name=None, args=(), kwargs={})

 需要關(guān)注的參數(shù)是target和args. target 是需要子線程運行的目標函數(shù),args是函數(shù)的參數(shù),以tuple的形式傳遞。
  以下代碼創(chuàng)建一個指向函數(shù)worker 的子線程
復(fù)制代碼 代碼如下:
def worker(a_tid,a_account):
     ...
th = threading.Thread(target=worker,args=(i,acc) ) ;

啟動這個線程

復(fù)制代碼 代碼如下:
th.start()

等待線程返回
復(fù)制代碼 代碼如下:
threading.Thread.join(th)

或者th.join()
如果你可以對要處理的數(shù)據(jù)進行很好的劃分,而且線程之間無須通信,那么你可以使用:創(chuàng)建=》運行=》回收的方式編寫你的多線程程序。但是如果線程之間需要訪問共同的對象,則需要引入互斥鎖或者信號量對資源進行互斥訪問。
 下面講講如何創(chuàng)建互斥鎖
創(chuàng)建鎖
復(fù)制代碼 代碼如下:
g_mutex = threading.Lock()
  ....

使用鎖 
    
復(fù)制代碼 代碼如下:
for  ... :
        #鎖定,從下一句代碼到釋放前互斥訪問
        g_mutex.acquire()
        a_account.deposite(1)
        #釋放
        g_mutex.release()

最后,模擬一個公交地鐵IC卡繳車費的多線程程序
  有10個讀卡器,每個讀卡器收費器每次扣除用戶一塊錢進入總賬中,每讀卡器每天一共被刷10000000次。賬戶原有100塊。所以最后的總賬應(yīng)該為10000100。先不使用互斥鎖來進行鎖定(注釋掉了鎖定代碼),看看后果如何。

import time,datetime
import threading
 
def worker(a_tid,a_account):
 global g_mutex
 print("Str " , a_tid, datetime.datetime.now() )
 for i in range(1000000):
  #g_mutex.acquire()
  a_account.deposite(1)
  #g_mutex.release()
 print("End " , a_tid , datetime.datetime.now() )
  
class Account:
 def __init__ (self, a_base ):
  self.m_amount=a_base
 def deposite(self,a_amount):
  self.m_amount+=a_amount
 def withdraw(self,a_amount):
  self.m_amount-=a_amount 
 
if __name__ == "__main__":
 global g_mutex
 count = 0
 dstart = datetime.datetime.now()
 print("Main Thread Start At: ", dstart)
 #init thread_pool
 thread_pool = []
 #init mutex
 g_mutex = threading.Lock()
 # init thread items
 acc = Account(100)
 for i in range(10):
  th = threading.Thread(target=worker,args=(i,acc) ) ;
  thread_pool.append(th)
   
 # start threads one by one  
 for i in range(10):
  thread_pool[i].start()
  
 #collect all threads
 for i in range(10):
  threading.Thread.join(thread_pool[i])
 dend = datetime.datetime.now()
 print("count=", acc.m_amount)
 print("Main Thread End at: ", dend, " time span ", dend-dstart)

注意,先不用互斥鎖進行臨界段訪問控制,運行結(jié)果如下:
201547153033091.png (640×398)

從結(jié)果看到,程序確實是多線程運行的。但是由于沒有對對象Account進行互斥訪問,所以結(jié)果是錯誤的,只有3434612,比原預(yù)計少了很多。

打開鎖后:
201547153202423.png (621×393)

這次可以看到,結(jié)果正確了。運行時間比不進行互斥多了很多,不過這也是同步的代價。
同時發(fā)現(xiàn),寫多線程,多進程類的程序,不能用自帶的idle來運行。會有錯誤。

相關(guān)文章

  • Python進階Matplotlib庫圖繪制

    Python進階Matplotlib庫圖繪制

    這篇文章主要介紹了Python進階Matplotlib庫圖繪制,Matplotlib:是一個Python的2D繪圖庫,通過Matplotlib,開發(fā)者可以僅需要幾行代碼,便可以生成折線圖,直方圖,條形圖,餅狀圖,散點圖等
    2022-07-07
  • python hbase讀取數(shù)據(jù)發(fā)送kafka的方法

    python hbase讀取數(shù)據(jù)發(fā)送kafka的方法

    今天小編就為大家分享一篇python hbase讀取數(shù)據(jù)發(fā)送kafka的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • python字符串對其居中顯示的方法

    python字符串對其居中顯示的方法

    這篇文章主要介紹了python字符串對其居中顯示的方法,涉及Python打印輸出顯示的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • python 移除字符串尾部的數(shù)字方法

    python 移除字符串尾部的數(shù)字方法

    今天小編就為大家分享一篇python 移除字符串尾部的數(shù)字方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 修改python plot折線圖的坐標軸刻度方法

    修改python plot折線圖的坐標軸刻度方法

    今天小編就為大家分享一篇修改python plot折線圖的坐標軸刻度方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 配置 Pycharm 默認 Test runner 的圖文教程

    配置 Pycharm 默認 Test runner 的圖文教程

    今天小編就為大家分享一篇配置 Pycharm 默認 Test runner 的圖文教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • cv2.imread?和?cv2.imdecode?用法及區(qū)別

    cv2.imread?和?cv2.imdecode?用法及區(qū)別

    對于路徑中含有中文的圖像,直接用cv2.imread讀取會報錯,上次看到有大佬使用cv2.imdecode就可以正常讀取,有點好奇,所以今天來記錄下二者用法和區(qū)別,感興趣的朋友跟隨小編一起看看吧
    2023-02-02
  • Python優(yōu)化算法之遺傳算法案例代碼

    Python優(yōu)化算法之遺傳算法案例代碼

    優(yōu)化算法,尤其是啟發(fā)式的仿生智能算法在最近很火,它適用于解決管理學,運籌學,統(tǒng)計學里面的一些優(yōu)化問題,這篇文章主要介紹了Python優(yōu)化算法—遺傳算法,需要的朋友可以參考下
    2023-02-02
  • ?分享4款Python 自動數(shù)據(jù)分析神器

    ?分享4款Python 自動數(shù)據(jù)分析神器

    這篇文章主要給大家分享的是4款Python 自動數(shù)據(jù)分析神器,我給大家分享 4 款常用的EDA工具,它們可以自動產(chǎn)出統(tǒng)計數(shù)據(jù)和圖表,為我們節(jié)省大量時間,需要的朋友可以參考一下
    2022-03-03
  • 簡單了解python中的f.b.u.r函數(shù)

    簡單了解python中的f.b.u.r函數(shù)

    這篇文章主要介紹了簡單了解python中的f.b.u.r函數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11

最新評論

汾西县| 恩施市| 临猗县| 漯河市| 天长市| 嫩江县| 庆安县| 视频| 皮山县| 会泽县| 天水市| 西乌| 麻阳| 抚宁县| 柳江县| 临湘市| 抚远县| 八宿县| 全南县| 垣曲县| 阳朔县| 澜沧| 开阳县| 泰州市| 革吉县| 麻江县| 灯塔市| 封开县| 苗栗市| 三明市| 江安县| 馆陶县| 临海市| 突泉县| 东山县| 九寨沟县| 蓬莱市| 凤冈县| 庆阳市| 周宁县| 宁乡县|