亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 1773 0

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

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

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

啟動這個線程

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

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

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

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

最后,模擬一個公交地鐵IC卡繳車費的多線程程序
? 有10個讀卡器,每個讀卡器收費器每次扣除用戶一塊錢進入總賬中,每讀卡器每天一共被刷10000000次。賬戶原有100塊。所以最后的總賬應該為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)


          

注意,先不用互斥鎖進行臨界段訪問控制,運行結果如下:
Python中嘗試多線程編程的一個簡明例子_第1張圖片

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

打開鎖后:
Python中嘗試多線程編程的一個簡明例子_第2張圖片

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 99在线免费观看视频 | 色猫咪av在线网址 | 国产一区二区三区精品视频 | 午夜二级| 简单视频在线播放jdav | 夜夜操网站 | 手机福利片 | 91在线看片 | 伊人久久在线视频 | 国产在线视频色综合 | 2022国产91精品久久久久久 | 亚洲无卡视频 | 久久久久久久久久久观看 | 色综合中文字幕在线亚洲 | 欧美性生交xxxxx丝袜 | 欧美综合成人网 | 日韩久久一级毛片 | 色黄啪啪网18以下勿入 | 国产免费爱在线观看视频 | 99在线看| 欧美白人极品性喷潮 | xx性欧美高清| 欧美精品久久久久久久影视 | 国产一区二区日韩欧美在线 | 亚州在线播放 | www国产永久免费视频看看 | 亚洲乱视频| 久草五月天 | 国产精品视频第一区二区 | 国产成人亚洲欧美三区综合 | 九九精品九九 | 免费女人18毛片a级毛片视频 | 99精品视频只99有精品 | 欧美成人免费一区在线播放 | 国产欧美日韩一区二区三区 | 日韩一级a毛片欧美一级 | 亚洲精品美女久久久久99 | 奇米影视播放器 | 91久久亚洲国产成人精品性色 | 网友自拍视频悠悠在线 | 天天干天天骑 |