多线程—异步执行
一、同步和異步的區(qū)別:
案例:
同步:就是女兒叫你起床,你還沒有起來,她一直在床邊等著也不去早讀,等你起來之后,再去單讀。
異步:就是女兒叫你起床,你還沒有起來,她對著你房間喊一聲"起床了",然后就不管了,自己去早讀了。
二、異步應(yīng)用
1、為完成某個任務(wù),不同程序單元之間過程中無需通信協(xié)調(diào),也能完成任務(wù)的方式。
2、不相關(guān)的程序單元之間可以是異步的。
3、例如,爬蟲下載網(wǎng)頁。調(diào)度程序調(diào)用下載程序后,即可調(diào)度其他任務(wù),而無需與該下載任務(wù)保持通信以協(xié)調(diào)行為。不同網(wǎng)頁的下載、保存等操作都是無關(guān)的,也無需相互通知協(xié)調(diào)。這些異步操作的完成時刻并不確定。異步意味著無序。
三、代碼展示
from multiprocessing import Process, Pool import os import time# 你女兒早讀,邊叫你起床,最后一起吃早餐def test1():print(f'當(dāng)前進(jìn)程id{os.getpid()},父進(jìn)程id{os.getppid()}')print('女兒叫你起床,你開始慢慢起床')time.sleep(3)print('你起來了')return 'abc'def test2():print(f'女兒開始早讀,當(dāng)前進(jìn)程id{os.getpid()}')time.sleep(4)print('女兒早讀完成')# todo 前面的2個異步任務(wù)test1和test2異步任務(wù),都完成了,才調(diào)用test3 def test3(args):print(f'最后一起吃早餐,當(dāng)前進(jìn)程的id{os.getppid()}')print(f'參數(shù)是{args}')if __name__ == '__main__':# 女兒使用主進(jìn)程代表# 父親使用進(jìn)程池中某個子進(jìn)程代表# 創(chuàng)建進(jìn)程池pool = Pool(4)pool.apply_async(func=test1, callback=test3) # todo callback表示回調(diào)函數(shù),test1執(zhí)行完畢之后,才會回調(diào)test3(自動的調(diào)用),主進(jìn)程調(diào)用# 主進(jìn)程代表女,叫父親起床之后,繼續(xù)做自己的早讀test2()print(f'主進(jìn)程結(jié)束,主進(jìn)程id{os.getpid()}')代碼執(zhí)行順序
總結(jié)
- 上一篇: MySQL—视图(二)
- 下一篇: 多线程通信—生产者和消费者模式