python中的线程
生活随笔
收集整理的這篇文章主要介紹了
python中的线程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
閱讀目錄
線程的理解應該結合進程來對比理解更直接
如果我們操作系統當做一個工廠的話,那么創建一個進程就相當于在這個工廠里面新增了一個車間,車間里面存放了很多資源,而車間要運行起來很顯然的標志就是流水線,而這些流水線就是線程,可以說線程是執行代碼的最小單位。
而線程和進程兩者在使用層面上有很大的相似性,所以開啟或者說創建線程的2種方式跟創建進程很相似,區別在于導入的模塊和類不一樣而已。
一、開啟線程方法:
-------------------------------------------------------------------- 注:如果你對python感興趣,我這有個學習Python基地,里面有很多學習資料,感興趣的+Q群:895817687 --------------------------------------------------------------------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 timeclass MyThread(Thread):def __init__(self, name):super().__init__()self.name = namedef 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= 99def task():global xx = 66t1 = 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 = namedef 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('歡迎歡迎')總結
以上是生活随笔為你收集整理的python中的线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中的进程
- 下一篇: websocket python爬虫_p