一、并發和并行
多任務的概念:
進程之間是并發還是并行。 1.簡單地說,就是操作系統可以同時運行多個任務。
并發:指的是任務數多余cpu核數,通過操作系統的各種任務調度算法,實現多個任務
"一起"執行(實際上總有一個任務不在執行,因為切換任務的速度相當快,看上去一起執行而已)
例子: 就相當于好幾個同學,同時提問一個老師,老師只能一個個回答。
并行:指的是任務數小于等于cpu核數,即任務真的一起執行的
例子: 就相當于好幾個同學,同時提問。多個老師同時給每個同學解答
總結:真正的并行執行多任務只能在多核cpu上實現,但是由于任務數量遠遠多于cpu的核心
數量,所以操作系統也會自動把很多任務輪流調度到每個核心上執行
2.同步異步
并發和并行的概念? 同步:是指線程在訪問某一資源時,獲得了資源的返回結果之后才會執行其他操作(先做
某些事,再做某些事)
異步:與同步相對,是指線程再訪問某一資源時,無論是否取得返回結果,都進行下一步操作;當有了資源返回結果時
系統會通知線程。
二、線程
1、threading模塊介紹
python的Thread模塊是比較底層的模塊,Python的threading模塊是對Thread做了一些包裝的
可以更加方便的被使用
創建線程對象:threading.Thread(target=func)
參數target指定線程執行的任務(函數)
Thread類提供了一下方法:
方法: 說明
run() 用以表示線程活動的方法
start() 啟動線程活動
join() 設置主線程會等待time秒后再往下執行,time默認為子線程結束,多個子線程
之間設置的值會疊加
isAlive() 返回線程是否活動的
getName() 返回線程名
threading.currentThread():返回當前執行的線程
threading.enumerate():返回正在運行的所有線程(list)。正在運行指線程啟動后,結束前,不包括啟動
前和終止后的線程
threading.activeCount():返回正在運行的線程數量
什么叫并行的工作方式、例子一:
import threading
# 創建線程
def func1(name):
print("線程一{}".format(name))
def func2():
print("線程二")
# 創建兩個線程
"""
target 傳入的函數名, args 函數的參數,是個元祖
"""
t1 = threading.Thread(target=func1, args=("貓咪",))
t2 = threading.Thread(target=func2)
# 啟動線程1
t1.start()
print(threading.current_thread())
t1.join()
# 啟動線程2
t2.start()
print(threading.current_thread(),threading.enumerate(),threading.active_count())
t2.join()
例子二:
# 創建線程的第二種寫法
import requests
class ThreadRequest(threading.Thread):
# 如果寫初始化函數一定要調用父類的__init__函數
def __init__(self, url):
self.url = url
super().__init__()
# 重寫Thread類里面的run方法
def run(self):
res = requests.get(self.url)
print("返回狀態碼{}".format(res.status_code))
url = "https://123.sogou.com/"
# 創建五個線程
for i in range(5):
t = ThreadRequest(url)
t.start()
t.join()