python的標準庫提供了兩個模組:thread
和threading
,thread
是低階模組,threading
是高階模組,對thread
進行了封裝。
我們使用threading
這個高階模組, 模擬火車站賣票,如果不加鎖,賣出同一張票:
import threading
from time import sleep, ctime
n = 100 # 100張票
def sell(name):
global n
while true:
if n>0:
sleep(0.1) #加入此句,可以讓執行緒賣出第0張票或同一張票
print("{}賣出第{}張票!\n".format(name,n))
n=n-1
def main():
threads = {}
for i in ( "a" ,"b" ):
# 例項化每個 thread 物件,把函式和引數傳遞進去,返回 thread 例項
t = threading.thread(target=sell, args=( i ,))
threads[i]=t # 分配執行緒
for i in ("a" ,"b"):
threads[i].start() # 開始執行多執行緒
for i in ("a" ,"b"):
threads[i].join() # 等待執行緒結束或超時,然後再往下執行
print("程式結束!")
if __name__ == '__main__':
main()
執行效果:
我們使用鎖來避免賣出同一張票,當多個執行緒同時執行lock.acquire()
時,只有乙個執行緒能成功地獲取鎖,然後繼續執行**,其他執行緒就等待直到獲得鎖為止。用try...finally
來確保鎖一定會被釋放。
import threading
from time import sleep, ctime
n = 100 # 100張票
lock = threading.lock()
def sell(name):
global n
while true:
lock.acquire()
try:
if n>0:
sleep(0.1) #加入此句,可以讓執行緒賣出第0張票或同一張票
print("{}賣出第{}張票!\n".format(name,n))
n=n-1
finally:
# 改完了一定要釋放鎖:
lock.release()
def main():
threads = {}
for i in ( "a" ,"b" ):
# 例項化每個 thread 物件,把函式和引數傳遞進去,返回 thread 例項
t = threading.thread(target=sell, args=( i ,))
threads[i]=t # 分配執行緒
for i in ("a" ,"b"):
threads[i].start() # 開始執行多執行緒
for i in ("a" ,"b"):
threads[i].join() # 等待執行緒結束或超時,然後再往下執行
print("程式結束!")
if __name__ == '__main__':
main()
執行效果:
多執行緒模擬火車站售票
生活中其實有很多多執行緒的例子,比如火車站售票就是乙個例子。我們先來分析一下,1 首先要有火車票的總數量,並且每賣出一張火車票,總量就減一 2 當火車票的數量小於1的時候,就停止售票 3 使用多執行緒模擬各個視窗進行售票 4 當火車票售完後,火車站也同樣歡迎我們 下來,我們 來實現火車站售票例項 p...
Python多執行緒實現模擬火車站售票
python的標準庫提供了兩個模組 thread和threading,thread是低階模組,threading是高階模組,對thread進行了封裝。我們使用threading這個高階模組,模擬火車站賣票,如果不加鎖,賣出同一張票 import threading from time import ...
python 多執行緒筆記(4) 車站售票模擬
import threading import time import random class worker threading.thread 售票員 def init self,wait num 5,index 0 super init self.wait num wait num 當前排隊人數...