python多線程同步售票系統解決思路

来源:https://www.cnblogs.com/lwsbc/archive/2022/05/05/16226012.html
-Advertisement-
Play Games

JList、JComboBox實現列表框 無論從哪個角度來看, JList 和 JComboBox 都是極其相似的,它們都有一個列表框,只是 JComboBox的列表框需要 以下拉方式顯示出來; JList 和 JComboBox 都可以通過調用 setRendererO方法來改變列表項的表現形式 ...


解決問題場景:假如剩餘1000張電影票需要售賣,同時有10家電影App來售賣這1000張電影票。主要的邏輯實現過程是什麼,要求使用python技術棧進行解題?

【閱讀全文】

file

1、分析過程

分析:主要信息點是10家App平臺同時售賣1000張電影票。此時,可以使用10個python線程來作為10家App平臺,同時售賣必須保證電影票數量的同步,比如A平臺賣出了一張票那總共剩餘的票數是999,B平臺若要再賣出一張票則應該是999-1=998張票。

技術棧分析:python多線程提供了threading模塊,並且threading模塊提供了同步鎖Lock來控制使得票數達到統一的效果。

2、準備過程

將相關的標準庫導入到代碼塊中,不用額外安裝其他的非標準庫。

import threading  # 多線程相關的操作

import os  # 應用退出操作

import time  # 線程中時間阻塞的控制

初始化一些全局參數,供後面調用過程中使用。

tickets = 1000  # 初始化電影票的總數為1000張

lock_ = threading.Lock()  # 獲取一個同步鎖對象,用於在多線程邏輯中實現鎖的控制

3、實現過程

編寫一個函數sell_tickets作為售票的函數實現過程。

def sell_tickets(app_name='承擔電影票售票任務App平臺'):

    global tickets  # 將這些電影票作為全局變數

    global lock_  # 將獲取到的鎖對象作為全局變數

    # 使用一個死迴圈來模擬當前的售票平臺一直在售票
    while True:

        lock_.acquire()  # 每個售票平臺進入售票後先加鎖處理

        if tickets > 0:  # 開始售票之前先判斷電影票的數量是否已經售完

            tickets = tickets - 1

            print('當前售票平臺:{},賣出一張電影票,剩餘電影票:{}張!'.format(app_name, tickets))

            time.sleep(0.1)

        else:

            print('電影票已經全部賣完了!')

            os._exit(0)

        lock_.release()  # 處理完成售票業務後將鎖釋放

        time.sleep(0.2)

至此,電影票售票的業務邏輯就寫完了。下麵再通過多線程實現多個電影票出售平臺同時售票就OK了。

app_thread_1 = threading.Thread(target=sell_tickets, args=('售票App平臺01',))

app_thread_1.start()

app_thread_2 = threading.Thread(target=sell_tickets, args=('售票App平臺02',))

app_thread_2.start()

app_thread_3 = threading.Thread(target=sell_tickets, args=('售票App平臺03',))

app_thread_3.start()

app_thread_4 = threading.Thread(target=sell_tickets, args=('售票App平臺04',))

app_thread_4.start()

app_thread_5 = threading.Thread(target=sell_tickets, args=('售票App平臺05',))

app_thread_5.start()

app_thread_6 = threading.Thread(target=sell_tickets, args=('售票App平臺06',))

app_thread_6.start()

app_thread_7 = threading.Thread(target=sell_tickets, args=('售票App平臺07',))

app_thread_7.start()

app_thread_8 = threading.Thread(target=sell_tickets, args=('售票App平臺08',))

app_thread_8.start()

app_thread_9 = threading.Thread(target=sell_tickets, args=('售票App平臺09',))

app_thread_9.start()

app_thread_10 = threading.Thread(target=sell_tickets, args=('售票App平臺10',))

app_thread_10.start()

file

【往期精彩】

發現幾個好玩的游戲編程平臺,與君共勉!

python四個性能檢測工具,包括函數的運行記憶體、時間等等...

如何將多張圖片合成mp4視頻格式,並加入背景音樂...

python如何實現網路測試,瞭解一下speedtest-cli...

模型已經寫好了,怎麼表白就看你的了!

歡迎關註作者公眾號【Python 集中營】,專註於後端編程,每天更新技術乾貨,不定時分享各類資料!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天的內容vue腳手架,越來越有內味了,也慢慢地開始有點難度了哈哈,但是沒有關係,慢慢學慢慢琢磨,我倒是感覺有點越來越像node了,不知道怎麼回事,這是要向後端發展的節奏啊 一.初始化Vue腳手架 1.說明 一般腳手架選擇最新版本 2.具體步驟 全局安裝vue/cli腳手架 切換到項目目錄,運行 v ...
  • 常用函數封裝 獲取某日期若幹個工作日後的日期 * 參數: * time: [String] 給定日期 yyyy-MM-dd * itervalByDay: [Number] 相隔工作日 * separator: [String] 年月日分隔符 * 返回: * rq:[String] 匹配的日期yyy ...
  • 某日,群里有這樣一個問題,如何實現這樣的表盤刻度: 這其實是個挺有意思的問題,方法也有很多。 單標簽,使用 conic-gradient 實現表盤刻度 最簡單便捷的方式,就是利用角向漸變的方式 conic-gradient,代碼也非常簡單,首先,我們實現一個重覆角向漸變: <div></div> d ...
  • 今天是對vue組件化的一個理解,最主要的單文件組件,然後就可以腳手架的學習了,本來昨晚就該上傳的,但是用的那個上傳博客園的Python腳本不行了,換了一個新的。 組件化讓我越來越感覺到框架的力量了 一.模塊與組件,模塊化與組件化 1.對組件的理解 如果以我們原來編寫一個網頁的方式 依賴關係混亂我就不 ...
  • 1.基本介紹 1.1.概念 高層模塊不能依賴於一個“具體化、細節化”的低層模塊,而是通過一個抽象的“規範/標準”建立兩者之間的依賴關係,簡言之就是:不依賴於實現,而是依賴於抽象。這裡“實現”一詞有的地方也稱為“細節”,在編碼中主要體現的是我們根據業務模型具體自定義的普通類,比如:員工類、商品類等。而 ...
  • 分享一下 Idea 的 scope 功能 事情的起因是我在使用 idea 的call hierarchy功能時,覺得它沒有像find usage那樣有排除功能,並且如果點擊了展開全部,當代碼中使用了某些框架導致調用層級非常深時,idea 會占用非常高的 CPU。 於是我去 jetbrains 的缺陷 ...
  • Spring自動註入 spring的ioc 在剛開始學習spring的時候肯定都知道spring的兩個特點:ioc,aop,控制反轉和切麵編程,這篇就只說說ioc ioc是什麼:在我們原來的代碼中,如果A依賴了B,那麼我們會自己在A類中來new B,創建B的實例來使用,是程式主動的去創建依賴,但是我 ...
  • 前言 隨著python越來越火爆併在2021年10月,語言流行指數的編譯器Tiobe將Python加冕為最受歡迎的編程語言,且置於Java、C和JavaScript之上,越來越多的人瞭解python. 但是,很多人都會疑惑: 它憑什麼這麼火爆呢?學了它能幹什麼?它真的有這麼厲害嗎? 在這些問題中,我 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...