在瞭解多線程前先給你們介紹下併發和並行:python
併發:多個任務一塊兒執行 在多任務之間快速切換處理 任務數量大於cpu核數多線程
並行:一個cpu核處理一個任務,多個cpu核同時處理多個任務 任務數量等於或者小於cpu核數 併發
再介紹下同步和異步 :異步
同步:指線程在訪問某一資源時,得到了資源的返回結果以後纔會執行其餘操做(先作某件事,再作某件事) url
異步: 與同步相對,是指線程在訪問某一資源時,不管是否取得返回結果,都進行下一步操做;當有了資源返回結果時 系統自會通知線程spa
在Python中,使用threading庫來建立多線程線程
import threading def func1(): for i in range(6): time.sleep(1) def func2(): for i in range(5): time.sleep(1) # 建立線程對象 t2 = threading.Thread(target=func2) # target = 方法名 t1 = threading.Thread(target=func1, name='線程1') # 能夠設置線程名字 # start 啓動線程活動 # join([time]) 設置主線程會等待time秒後再往下執行,time默認爲子線程結束,多個子線程之間設置的值會增長 # isAlive 返回線程是否活動的 # getName() 返回線程名 # setName() 設置線程名 a = time.time() t2.start() # 開始執行線程2 t1.start() # 開始執行線程1 # 讓主線程等待子線程執行完後再繼續往下執行 同步的概念 t2.join() t1.join() b = time.time() c = b - a print(c) threading.currentThread() # 返回當前執行的線程 threading.enumerate() # 返回正在運行的全部線程(list) 正在運行指:啓動後、結束前,不包括了啓動前和終止後的線程 threading.activeCount() # 返回正在運行的線程數量
在threading庫中調用start方法後,start方法調用了他內部的run()方法,咱們能夠經過繼承threading重寫run()方法來批量建立線程,代碼以下code
import threading import requests import time # 經過繼承 threading 類來建立線程 重寫run方法 由於start方法調用的就是run 重寫run class MyClass(threading.Thread): def __init__(self, url): self.url = url super().__init__() # 若是要傳入參數重寫init方法時,必定要調用父類的init方法 # 發送requests請求 def run(self): res = requests.get(self.url) print('線程{},返回{}'.format(threading.current_thread(), res.status_code)) t1 = time.time() for i in range(5): t = MyClass('https://www.baidu.com') t.start() t.join() t2 = time.time() print(t2 - t1)
能夠經過直接實例化類來建立線程對象,若是要傳入參數,在重寫init方法時要注意在最後調用父類的init方法,具體緣由能夠去查看thrreading庫是如何實現的,在init方法中有不少其餘的代碼須要執行。orm
多線程共享全局變量:對象
在python中是使用單核來處理線程的,也就是併發並不是並行,代碼示例以下:
import threading a = 100 def func1(): for i in range(100000): global a a += 1 print(a) def func2(): for i in range(100000): global a a += 1 print(a) t1 = threading.Thread(func1()) t2 = threading.Thread(func2()) t1.start() t2.start()
當執行func1()方法時,獲取全局變量爲100,此時暫停切換到func2()方法,獲取全局變量a爲100,並進入for循環,當a循環到20000時(舉例),又切換到func1()方法中開始執行for循環,此時在func1()中a的值爲100,循環1次後把a的值又更新爲101,形成數據不許確。
解決這個問題會用到互斥鎖、同步、隊列,在下一篇會給你們講到