Python中嘗試多執行緒程式設計的乙個簡明例子

2022-10-04 23:18:26 字數 3064 閱讀 9510

綜述

多執行緒是程式設計中的乙個重要方面,尤其是在伺服器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...