主要方法 經常使用的就是 from multiprocessing import Poolpython
map() 同步編程
apply() 同步app
apply_async() 異步 手動 close() join() 學的逐漸的由淺入深異步
# !/usr/bin/env python # !--*--coding:utf-8 --*-- # !@Time :2018/7/18 16:44 # !@Author TrueNewBee # 爲何會有進程池的概念 # 效率 # 每開啓進程,開啓屬於這個進程的內存空間 # 寄存器 堆棧 文件 # 進程過多 操做系統的調度 # 進程池 # python中的 先建立一個屬於進程的池子 # 這個池子指定能放多少個進程 # 先將這些進程建立好 # 更高級的進程池 # 能夠根據用戶需求改變進程數量 # 自帶join方法,裏面是異步 # map(func,range) 裏面傳入的參數只能傳入可迭代的 range ,列表,字典等 import time from multiprocessing import Pool, Process def func(n): for a in range(10): print(n+1) if __name__ == '__main__': start = time.time() pool = Pool(5) # 5個進程 pool.map(func, range(100)) # 100個任務 異步 t1 = time.time() - start p_list = [] for i in range(100): p = Process(target=func, args=(i, )) p_list.append(p) p.start() for i in p_list:p.join() t2 = time.time()-start print(t1, t2)
# !/usr/bin/env python # !--*--coding:utf-8 --*-- # !@Time :2018/7/18 20:29 # !@Author TrueNewBee # apply() 方法爲同步的 # apply_async() 方法爲異步的 通常都是用這個 import time import os from multiprocessing import Pool def func(n): print('start func%s' % n, os.getpid()) time.sleep(1) print('end func%s' % n, os.getpid()) if __name__ == '__main__': p = Pool(5) for i in range(10): # p.apply(func, args=(i, )) # 該方法爲同步的 p.apply_async(func, args=(i,)) # 該方法爲異步的 # 使用apply_async 必須加的兩句話 p.close() # 結束進程接收任務 p.join() # 感知進程池中的任務執行結束
# !/usr/bin/env python # !--*--coding:utf-8 --*-- # !@Time :2018/7/18 21:05 # !@Author TrueNewBee # p = Pool() # p.map(funcName, iterable) 默認異步的執行任務,且自帶close和join # p.apply 同步調用的 # p.apply_async 異步調用 和主進程徹底異步 須要手動close 和join import time from multiprocessing import Pool def func(i1): time.sleep(0.5) return i1*i1 if __name__ == '__main__': p = Pool() # res_list = [] # 儲存res對象 到後面一塊被接收 # for i in range(10): # res = p.apply_async(func, args=(i, )) # apply_async的結果就是func的返回值 # res_list.append(res) # # res.get() # get() 等着func的計算結果,阻塞了(同步) # for res in res_list: # print(res.get()) # 每五個返回一次數據 讓get()變成了異步 # map() ret = p.map(func, range(100)) print(ret) # 總體返回全部數據
# !/usr/bin/env python # !--*--coding:utf-8 --*-- # !@Time :2018/7/18 21:06 # !@Author TrueNewBee # 回調函數 import os from multiprocessing import Pool def func1(n): print('in func1',os.getpid()) return n*n def func2(nn): print('in func2', os.getpid()) print(nn) if __name__ == '__main__': print('主進程:', os.getpid()) # 回調函數在主進程中執行的 p = Pool(5) for i in range(10): p.apply_async(func1, args=(10, ), callback=func2) # 回調func2返回值編程參數傳給func1 p.close() p.join()