異步的 apply_async
# 1.若是是異步的提交任務,那麼任務提交以後進程池和主進程也異步了,
#主進程不會自動等待進程池中的任務執行完畢
# 2.若是須要主進程等待,須要p.join
# 可是join的行爲是依賴close
# 3.若是這個函數是有返回值的
# 也能夠經過ret.get()來獲取返回值
# 可是若是一邊提交一遍獲取返回值會讓程序變成同步的
# 因此要想保留異步的效果,應該講返回對象保存在列表裏,全部任務提交完成以後再來取結果
# 這種方式也能夠去掉join,來完成主進程的阻塞python
同步請求的多線程
import os import time from multiprocessing import Pool # 同步請求的 # def wahaha(): # time.sleep(1) # print(os.getpid()) # return True # # if __name__ == '__main__': # p = Pool(5) # CPU的個數 或者 +1 # ret_l = [] # for i in range(20): # ret = p.apply(func = wahaha) # 同步的,不用 # print(ret)
異步請求的app
ef wahaha(): time.sleep(1) print(os.getpid()) if __name__ == '__main__': p = Pool(5) # CPU的個數 或者 +1 ret_l = [] for i in range(20): ret = p.apply_async(func = wahaha) # async 異步的 ret_l.append(ret) p.close() # 關閉 進程池中的進程不工做了 # 而是關閉了進程池,讓任務不能再繼續提交了 p.join() # 等待這個池中提交的任務都執行完 # # 表示等待全部子進程中的代碼都執行完 主進程才結束
# 異步提交,獲取返回值,等待全部任務都執行完畢以後再統一獲取結果dom
def wahaha(): time.sleep(1) print(os.getpid()) return True if __name__ == '__main__': p = Pool(5) # CPU的個數 或者 +1 ret_l = [] for i in range(20): ret = p.apply_async(func = wahaha) # async 異步的 ret_l.append(ret) p.close() # 關閉 進程池中的進程不工做了 # 而是關閉了進程池,讓任務不能再繼續提交了 p.join() # 等待這個池中提交的任務都執行完 for ret in ret_l: print(ret.get())
異步提交,獲取返回值,一個任務執行完畢以後就能夠獲取到一個結果(順序是按照提交任務的順序)異步
def wahaha(): time.sleep(1) print(os.getpid()) return True if __name__ == '__main__': p = Pool(5) # CPU的個數 或者 +1 ret_l = [] for i in range(20): ret = p.apply_async(func = wahaha) # async 異步的 ret_l.append(ret) for ret in ret_l: print(ret.get())
2 回調函數 _ 在主進程中執行async
在發起任務的時候 指定callback參數ide
在每一個進程執行完apply_async任務以後,返回值會直接做爲參數傳遞給callback的函數,執行callback函數中的代碼函數
等待池中的任務執行完畢spa
import os import time import random from multiprocessing import Pool def wahaha(num): time.sleep(random.random()) print('pid : ',os.getpid(),num) return num def back(arg): print('call_back : ',os.getpid(),arg) if __name__ == '__main__': print('主進程',os.getpid()) p = Pool(5) # CPU的個數 或者 +1 for i in range(20): ret = p.apply_async(func = wahaha,args=(i,),callback=back) # async 異步的 p.close() p.join()
3 進程的總結操作系統
# 進程
# 進程三狀態
# 同步異步阻塞非阻塞
# 請解釋異步非阻塞
# 給開發完成的全部裝飾器+log
# 是計算機中最小的資源分配單位
# 進程的建立 Process
# 進程之間的異步 自己子進程主進程之間都是異步的
# 進程之間的同步控制 Lock Semaphore Event
# 進程之間的數據隔離 自己進程與進程之間都是數據隔離的
# 進程之間通訊 IPC 管道 隊列
# 數據共享 Manager
# 進程池 -能夠獲取返回值
# 同步調用 - 基本不用的
# 異步調用 - 重要的
# apply_async
# get獲取結果
# close
# join
# 回調函數 Pool 回調函數在主進程中執行
# apply_async(func = wahaha,callback = back)
4 線程的概念
import os import time from threading import Thread def func(): time.sleep(1) print(123,os.getpid()) print(123,os.getpid()) for i in range(10): # func() Thread(target=func).start()