python中的線程

来源:https://www.cnblogs.com/suguangti/archive/2019/05/10/10841948.html
-Advertisement-
Play Games

線程的理解應該結合進程來對比理解更直接 如果我們操作系統當做一個工廠的話,那麼創建一個進程就相當於在這個工廠裡面新增了一個車間,車間裡面存放了很多資源,而車間要運行起來很顯然的標誌就是流水線,而這些流水線就是線程,可以說線程是執行代碼的最小單位。 而線程和進程兩者在使用層面上有很大的相似性,所以開啟 ...


線程的理解應該結合進程來對比理解更直接

如果我們操作系統當做一個工廠的話,那麼創建一個進程就相當於在這個工廠裡面新增了一個車間,車間裡面存放了很多資源,而車間要運行起來很顯然的標誌就是流水線,而這些流水線就是線程,可以說線程是執行代碼的最小單位。

而線程和進程兩者在使用層面上有很大的相似性,所以開啟或者說創建線程的2種方式跟創建進程很相似,區別在於導入的模塊和類不一樣而已。

一、開啟線程方法:

第一種:

from threading import Thread
import time
def task(name):
    time.sleep(2)
    print('%s has no jj' %name)

if __name__ == '__main__':
    t=Thread(target=task,args=('JJ',))
    t.start()
    print('')

第二種:

from threading import Thread
import time


class MyThread(Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        print("%s is running" % self.name)
        time.sleep(1)
        print("%s is done" % self.name)


t1 = MyThread('Mr hello')
t1.start()
t1.join()
print('zhuzhuzhu')

二、線程之間的數據共用

前面我們學到進程的時候知道進程與進程之間記憶體空間是相互隔離的,互相無法直接訪問到,那麼線程之間的共用呢

下麵通過一段代碼來看看數據直接是否共用:

from threading import Thread
x= 99

def task():
    global x
    x = 66

t1 = Thread(target=task)  # 創建子線程對象
t1.start()  # 向操作系統發送子線程執行請求
t1.join()   # 子線程完畢後才往下走,此時子進程已經執行了x = 66,如果最終列印
# 的是99,則代表子進程無法修改主進程中的x,如果是66則子進程與主進程公共一記憶體空間,可以修改
print(x)   # 結果為66,證明公用一個記憶體空間

可以看到,線程之間的數據時具有共用性的,所以就會存在一個隱患,當多個線程同時併發操作同一數據時候或者執行同一代碼的時候在某種場景下會導致混亂。

這就是我們後面學到的GIL(global interpreter lock)全局解釋器鎖的必要性的原因。在這裡先提一下。

三、線程的互斥鎖:

線程的互斥鎖,同理進程的互斥鎖,作用也是為了保證數據的安全,何種情況:多線程同時訪問操作同一數據時候

先產生鎖,再在操作數據的那段代碼前後加鎖,操作完畢釋放鎖。實現方法:

from threading import Thread, Lock
import time
import random
import json
mutex = Lock()   # 創建鎖


class MyThread(Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        time.sleep(0.5)   #保證多線程同一時間搶鎖,睡個0.5秒,等待大部分線程都能運行到此處,開始搶鎖
        mutex.acquire()   # 加鎖
        with open('info', 'r', encoding='utf-8') as f1:     # 簡單模擬搶票過程
            dic = json.load(f1)
            num = dic.get('remain')
            # time.sleep(random.randint(1, 5))
            print('剩餘票數:%s' % num)
            if not num:
                print('票已售完,%s購票失敗' % self.name)
            else:
                dic['remain'] -= 1
                # time.sleep(random.randint(1, 5))
                with open('info', 'w', encoding='utf-8') as f2:
                    json.dump(dic, f2)
                    print('用戶%s購票成功!' % self.name)
        mutex.release()           # 釋放鎖,這裡註意釋放位置


user2 = MyThread('egon')
user3 = MyThread('jason')
user1 = MyThread('alex')

user2.start()
user3.start()
user1.start()

user1.join()
user2.join()
user3.join()

print('歡迎歡迎')

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 服務目錄 服務目錄對應的介面是Directory,這個介面里主要的方法是 List list(Invocation invocation) throws RpcException; 列出所有的Invoker,對於服務消費端而言,一個Invoker對應一個可用的服務提供者,底層封裝了一個tcp連接。當 ...
  • 一、枚舉的定義 枚舉是一組命名整型常量。枚舉類型是使用 enum 關鍵字聲明的。 C# 枚舉是值類型。換句話說,枚舉包含自己的值,且不能繼承或傳遞繼承。 二、枚舉的聲明 聲明枚舉的一般語法: enum <enum_name> { enumeration list }; 其中, enum_name 指 ...
  • 一直以來,自己讀過的技術類書籍也不少了,但是都犯了一個毛病就是沒有很好的記錄下來,有些東西可能並不是平日開發中時時刻刻用到的,隨著時間的延長,學過的東西慢慢也就淡忘了,剛好最近有些時間,也正打算把<<設計模式之禪>>這本書好好的通讀一遍,順便把所想所得詳細的記錄一下,也方便以後查閱和回顧。 好,以上 ...
  • 心知天氣數據API 的QPS 在高峰時期已經達到數千的量級,如何承載這樣海量的併發請求,使客戶能穩定及時的獲取到所需數據自然也是心知技術團隊一路以來不斷探索的主題。 ...
  • 提出問題 「領域驅動設計」之於微服務,好比麥當勞之於漢堡(個人更喜歡肯德基,漢堡要大些,麥當勞的漢堡,想吃頓飽飯,請先給我上6個😂)。但是TDD測試驅動、MDD模型驅動好像也很火啊,到底什麼在驅動? 分析問題 不用著急,這是三個5分鐘就能區分開的概念。開發中在協同工作。 首先糾正兩個誤區。DDD是 ...
  • 一.SpringAOP的概述。 AOP(Aspect Oriented Programming),面向切麵編程,通過預編譯方式和運行期間動態代理實現程式的功能的統一維護的技術。AOP是OOP(面向對象編程)的擴展和延伸。舉個例子,讓大家對AOP印象更加深刻點。 比如許可權校驗。實際開發中,我們知道不是 ...
  • 一、JDK的安裝 1、打開下載好的安裝包(我在這裡附上一個百度雲連接,https://pan.baidu.com/s/1o3nx0kbmecAISeneGqykLQ 提取碼:jnw6) 傻瓜式安裝,直接點下一步就行。 2、安裝路徑 安裝路徑隨意,只要不是中文路徑就Ok!!!我比較懶,直接使用的預設安 ...
  • 參考自:https://blog.csdn.net/dreaming__ldx/article/details/84976834 https://blog.csdn.net/acterminate/article/details/79339494 題意: 給你一個數組,將數組裡的所有元素進行全排列, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...