最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python的線程使用隊列Queue來改造轉(zhuǎn)賬場景

 更新時間:2022年02月24日 11:27:56   作者:雷學委  
前篇我們了隊列Queue和轉(zhuǎn)賬場景這次趁熱學委展示一下使用隊列解決轉(zhuǎn)賬場景的問題,這篇文章主要介紹了Python的線程使用隊列來改造轉(zhuǎn)賬場景,需要的朋友可以參考一下

前篇我們了隊列Queue轉(zhuǎn)賬場景這次趁熱學委展示一下使用隊列解決轉(zhuǎn)賬場景的問題。

一、看看轉(zhuǎn)賬場景的問題

前面有兩篇文章展示了轉(zhuǎn)賬反復讀寫amount,導致結(jié)果出錯。

xuewei_account = dict()
xuewei_account['amount'] = 100

# amount為負數(shù)即是轉(zhuǎn)出金額
def transfer(money):
? ? for i in range(100000):
? ? ? ? xuewei_account['amount'] = xuewei_account['amount'] + money

我們前幾篇使用多個線程反復轉(zhuǎn)長:+1和-1。

按常理,結(jié)果應該仍舊是100.

這個是全部代碼:

import random
import threading
import datetime
import time

xuewei_account = dict()
xuewei_account['amount'] = 100


# amount為負數(shù)即是轉(zhuǎn)出金額
def transfer(money):
? ? for i in range(100000):
? ? ? ? xuewei_account['amount'] = xuewei_account['amount'] + money


# 創(chuàng)建20個任務重復給學委賬戶轉(zhuǎn)賬
threads = []
for i in range(10):
? ? t1 = threading.Thread(target=lambda: transfer(-1))
? ? threads.append(t1)
? ? t2 = threading.Thread(target=lambda: transfer(1))
? ? threads.append(t2)

for t in threads:
? ? t.start()
for t in threads:
? ? t.join()

print("-" * 16)
print("活躍線程數(shù):", threading.active_count())
print("活躍線程:", threading.current_thread().name)
print("學委賬戶余額:", xuewei_account)

等待所有轉(zhuǎn)賬線程運行結(jié)束,我們看到結(jié)果是錯誤的:

二、這種問題怎么使用隊列來解決呢?

前面說了,多線程反復讀寫共享數(shù)據(jù),是問題的根源。

改代碼為同步互斥模式,保證任意一個時間一個線程更新共享數(shù)據(jù),那么問題就解決了。(這前面也展示了,用的是Lock鎖的方案)

這個能怎么用隊列呢?

可以先思考10秒,根據(jù)學習到的加鎖和隊列的特性,想想這個怎么做。

好,答案現(xiàn)在揭曉:

Queue這個隊列有多個函數(shù),一個是put函數(shù),一個是get函數(shù)。

一個負責放入數(shù)據(jù)到隊尾,一個可以從對頭取出元素。

剛好適合轉(zhuǎn)賬業(yè)務,我們是不是可以把每次轉(zhuǎn)賬操作變成一個一個指令/事件。 比如下面的:

event(amount=1,acount=xuewei_account)
....
event(amount=-1,acount=xuewei_account)
....
event(amount=1,acount=xuewei_account)
....
event(amount=-1,acount=xuewei_account)

20個線程,每個10萬次數(shù)據(jù)讀寫,共200萬個事件。

所以我們可以把這個事情轉(zhuǎn)換為:200萬個轉(zhuǎn)賬事件。

因為Queue是線程安全的,所以我們可以并發(fā)200萬次轉(zhuǎn)賬,另外交給一線程進行轉(zhuǎn)賬處理。

這樣就保證每次只有一個線程對xuewei_account學委賬戶進行讀寫。

改造,使用隊列來解決問題

展示代碼:

import random
import threading
import datetime
import time
import queue

q = queue.Queue()

xuewei_account = dict()
xuewei_account['amount'] = 100


# amount為負數(shù)即是轉(zhuǎn)出金額
def transfer(money):
? ? for i in range(100000):
? ? ? ? q.put(money)


def handle_amount():
? ? while not q.empty():
? ? ? ? amount = q.get()
? ? ? ? xuewei_account['amount'] += amount


def monitor_q():
? ? counter = 0
? ? time.sleep(3)
? ? while counter < 1000 and not q.empty():
? ? ? ? print("q size:", q.qsize())
? ? ? ? time.sleep(3)
? ? ? ? counter+=1


q_thread = threading.Thread(name="Q監(jiān)控", target=monitor_q)
q_thread.start()
# 創(chuàng)建20個任務重復給學委賬戶轉(zhuǎn)賬
threads = []
for i in range(10):
? ? t1 = threading.Thread(target=lambda: transfer(-1))
? ? threads.append(t1)
? ? t2 = threading.Thread(target=lambda: transfer(1))
? ? threads.append(t2)

for t in threads:
? ? t.start()

vip_thread = threading.Thread(name="處理轉(zhuǎn)賬專線", target=handle_amount)
vip_thread.start()

for t in threads:
? ? t.join()
vip_thread.join()

print("-" * 16)
print("活躍線程數(shù):", threading.active_count())
print("活躍線程:", threading.current_thread().name)
print("學委賬戶余額:", xuewei_account)

這里運行了多個線程執(zhí)行轉(zhuǎn)賬(發(fā)送轉(zhuǎn)賬金額進隊列)。

然后運行一個vip通道(單獨線程)處理學委賬戶的轉(zhuǎn)賬業(yè)務。

同時也運行了一個監(jiān)控隊列的線程,每隔一段時間打印隊列的任務情況。

下面是運行結(jié)果,運行幾次結(jié)果都是正確的。

運行幾次最終賬戶余額都是100, 改造成功。

三、總結(jié)

本篇學委分享了線程安全的隊列Queue解決并發(fā)轉(zhuǎn)賬問題。

其實代碼還可以再度優(yōu)化的,為了控制篇幅,代碼也不少,希望讀者朋友們能夠先看熟學會,掌握隊列的使用。

到此這篇關于Python的線程使用隊列來改造轉(zhuǎn)賬場景的文章就介紹到這了,更多相關Python使用隊列來改造轉(zhuǎn)賬場景內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python實現(xiàn)RGB與YCBCR顏色空間轉(zhuǎn)換

    python實現(xiàn)RGB與YCBCR顏色空間轉(zhuǎn)換

    這篇文章主要介紹了python實現(xiàn)RGB與YCBCR顏色空間轉(zhuǎn)換,RGB與YCbCr顏色空間概念的與變換關系,包括內(nèi)容灰度值和亮度的關系、RGB顏色空間與顏色控制、YCbCr顏色空間及與RGB的變換關系,需要的小伙伴可以參考一下
    2022-03-03
  • 解決pycharm下載庫時出現(xiàn)Failed to install package的問題

    解決pycharm下載庫時出現(xiàn)Failed to install package的問題

    很多小伙伴遇到pycharm下載庫時出現(xiàn)Failed to install package不知道怎么解決,下面小編給大家?guī)砹私鉀Q方法,需要的朋友參考下吧
    2021-09-09
  • python中py文件與pyc文件相互轉(zhuǎn)換的方法實例

    python中py文件與pyc文件相互轉(zhuǎn)換的方法實例

    pyc是一種二進制文件,是由py文件經(jīng)過編譯后,生成的文件,下面這篇文章主要給大家介紹了關于python中py文件與pyc文件相互轉(zhuǎn)換的相關資料,需要的朋友可以參考下
    2022-05-05
  • 使用 Python 合并多個格式一致的 Excel 文件(推薦)

    使用 Python 合并多個格式一致的 Excel 文件(推薦)

    這篇文章主要介紹了使用 Python 合并多個格式一致的 Excel 文件,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • 解決使用pip安裝報錯:Microsoft?Visual?C++?14.0?is?required.

    解決使用pip安裝報錯:Microsoft?Visual?C++?14.0?is?required.

    對于程序員來說,經(jīng)常pip安裝自己所需要的包,大部分的包基本都能安裝,但是總會遇到包安裝不了的問題,下面這篇文章主要給大家介紹了關于如何解決使用pip安裝報錯:Microsoft?Visual?C++?14.0?is?required.的相關資料,需要的朋友可以參考下
    2022-09-09
  • 淺談python數(shù)據(jù)結(jié)構之動態(tài)規(guī)劃

    淺談python數(shù)據(jù)結(jié)構之動態(tài)規(guī)劃

    這篇文章主要介紹了淺談python數(shù)據(jù)結(jié)構之動態(tài)規(guī)劃,可能很多小伙伴會覺得這個詞很陌生,覺得這是一種很復雜的思想,學習起來很困難,其實并不是這樣,動態(tài)規(guī)劃所講述的知識與動態(tài)與規(guī)劃并無太大關聯(lián),需要的朋友可以參考下
    2023-07-07
  • python爬取各類文檔方法歸類匯總

    python爬取各類文檔方法歸類匯總

    網(wǎng)絡爬蟲不僅需要能夠抓取HTML中的敏感信息,也需要有抓取其他類型文檔的能力這篇文章主要為大家匯總了python爬取各類文檔方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • anaconda虛擬環(huán)境python?sklearn庫的安裝過程

    anaconda虛擬環(huán)境python?sklearn庫的安裝過程

    Anaconda是專注于數(shù)據(jù)分析的Python發(fā)行版本,包含了conda、Python等190多個科學包及其依賴項,這篇文章主要給大家介紹了關于anaconda虛擬環(huán)境python?sklearn庫的安裝過程,需要的朋友可以參考下
    2023-11-11
  • Python?OpenCV實現(xiàn)簡單的顏色識別功能(對紅色和藍色識別并輸出)

    Python?OpenCV實現(xiàn)簡單的顏色識別功能(對紅色和藍色識別并輸出)

    Python?OpenCV可以用來進行顏色識別,可以通過讀取圖像的像素值,來判斷像素點的顏色,從而實現(xiàn)顏色識別,這篇文章主要給大家介紹了關于Python?OpenCV實現(xiàn)簡單的顏色識別功能(對紅色和藍色識別并輸出)的相關資料,需要的朋友可以參考下
    2023-12-12
  • python框架django基礎指南

    python框架django基礎指南

    本文給大家匯總介紹了下python的MVC框架django的一些基礎知識,非常的簡單實用,希望對大家學習django能夠有所幫助。
    2016-09-09

最新評論

柯坪县| 泽州县| 巨鹿县| 富宁县| 阿瓦提县| 茂名市| 鄂托克前旗| 东平县| 吐鲁番市| 尼玛县| 呼玛县| 齐齐哈尔市| 汾西县| 定襄县| 那坡县| 武冈市| 乌鲁木齐县| 晋中市| 常熟市| 克拉玛依市| 新巴尔虎右旗| 福安市| 隆回县| 大丰市| 绍兴市| 宁国市| 铜川市| 疏勒县| 南平市| 观塘区| 方城县| 包头市| 靖西县| 资兴市| 汾西县| 芮城县| 五指山市| 万载县| 广东省| 贵德县| 阿鲁科尔沁旗|