Python多執行緒(模擬火車站售票)

2021-09-19 23:20:27 字數 2045 閱讀 6301

python的標準庫提供了兩個模組:threadthreadingthread是低階模組,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 當前排隊人數...