綜述
多執行緒是程式設計中的乙個重要方面,尤其是在伺服器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()
如果你可以對要處理的資料進行很好的劃分,而且執行緒之間無須通訊,那麼你可以使用:建立=》執行=》**的方式編寫你的多執行緒程式。但是如果執行緒之間需要訪問共同的物件,則需要引入互斥鎖或者訊號量對資源進行互斥訪問。
www.cppcns.com下面講講如何建立互斥鎖
建立鎖
複製** **如下:
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: ", dstar程式設計客棧t)
#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(ylvjqgz10):
threwww.cppcns.comading.thread.join程式設計客棧(thread_pool[i])
dend = datetime.datetime.now()
print("count=", acc.m_amount)
print("main thread end at: ", dend, " time span ", dend-dstart)
注意,先不用互斥鎖進行臨界段訪問控制,執行結果如下:
從結果看到,程式確實是多執行緒執行的。但是由於沒有對物件account進行互斥訪問,所以結果是錯誤的,只有3434612,比原預計少了很多。
開啟鎖後:
這次可以看到,結果正確了。執行時間比不進行互斥多了很多,不過這也是同步的代價。
同時發現,寫多執行緒,多程序類的程式,不能用自帶的idle來執行。會有錯誤。
本文標題: python中嘗試多執行緒程式設計的乙個簡明例子
本文位址:
多執行緒嘗試
先貼 package com.mult.test public class mythread class runaablethread implements runnable catch interruptedexception e system.out.println thread.current...
多執行緒 嘗試Thread
這幾天用到多執行緒時才發現自己對多執行緒的了解少之又少,僅僅停留在lock上面,好了,我們知道 負載 是乙個很時尚,很牛x的玩意,往大處說,需要負載,資料庫需要負載。往小處說,執行緒也需要負載,面對海量的 使用者請求,我們的單執行緒肯定扛不住,那麼怎麼辦,一定要負載,所以說多執行緒是我們碼農必須要熟...
python中多執行緒程式設計 Python的多執行緒程式設計
提到多執行緒,很多人就會望而卻步,本文將由淺入深地帶你攻克python多執行緒程式設計,並防止你跳入深坑,首先看一段簡單的 1 from time importctime,sleep2 defplay video video 3 for i in range 2 4 print i am playi...