進程池的使用實例
import time from concurrent.futures import ProcessPoolExecutor def func(name): print(f"{name}開始") time.sleep(0.5) print(f"{name}結束") if __name__ == '__main__': p = ProcessPoolExecutor(max_workers=3) # 創建一個進程池 for i in range(1, 10): p.submit(func, f"進程{i}") # 往進程池內提交任務 p.shutdown() # 主進程等待子進程結束 print("主進程結束")
執行結果:
進程1開始
進程2開始
進程3開始
進程1結束
進程4開始
進程2結束
進程5開始
進程3結束
進程6開始
進程4結束
進程7開始
進程5結束
進程8開始
進程6結束
進程9開始
進程7結束
進程8結束
進程9結束
主進程結束
創建一個進程池,進程池里有3個進程同時在執行任務,哪個進程執行完了,會自動執行下一個任務,相當於原來是一個人干活,現在是3個人一起干活,速度會提高很多。
線程池的使用實例
import time from concurrent.futures import ThreadPoolExecutor def func(name): print(f"{name}開始") time.sleep(0.5) print(f"{name}結束") if __name__ == '__main__': p = ThreadPoolExecutor(max_workers=3) # 創建一個線程池,里面最多有3個線程同時工作 for i in range(1, 10): p.submit(func, f"線程{i}") p.shutdown() # 主線程等待子線程結束 print("主線程結束")
執行結果:
線程1開始
線程2開始
線程3開始
線程3結束
線程1結束
線程2結束
線程4開始
線程5開始
線程6開始
線程5結束
線程4結束
線程6結束
線程7開始
線程8開始
線程9開始
線程7結束
線程8結束
線程9結束
主線程結束
創建一個線程池,線程池里有3個線程同時在執行任務,哪個線程執行完了,會自動執行下一個任務,相當於原來是一個人干活,現在是3個人一起干活,速度會提高很多。
對比看下線程池和進程池(用法完全一樣)
import os import time from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor import threading import random def f(n): time.sleep(random.randint(1, 3)) # print(n) # print("進程(%s) %s的平方: %s" % (os.getpid(), n, n*n)) print("線程(%s) %s的平方: %s" % (threading.current_thread().getName(), n, n * n)) return n * n if __name__ == '__main__': pool = ThreadPoolExecutor(max_workers=5) # pool = ProcessPoolExecutor(max_workers=5) ret_list = [] for i in range(10): ret = pool.submit(f, i) # 異步提交任務,f函數名稱或者方法名稱,i給f函數的參數 # print(ret.result()) #join ret_list.append(ret) # pool.shutdown() #鎖定線程池,不讓新任務再提交進來了.輕易不用 for i in ret_list: print(i.result())
執行結果:
線程(ThreadPoolExecutor-0_2) 2的平方: 4 線程(ThreadPoolExecutor-0_3) 3的平方: 9 線程(ThreadPoolExecutor-0_1) 1的平方: 1 線程(ThreadPoolExecutor-0_0) 0的平方: 0 線程(ThreadPoolExecutor-0_2) 5的平方: 25 0 1 4 9 線程(ThreadPoolExecutor-0_4) 4的平方: 16 16 25 線程(ThreadPoolExecutor-0_3) 6的平方: 36 36 線程(ThreadPoolExecutor-0_1) 7的平方: 49 線程(ThreadPoolExecutor-0_2) 9的平方: 81 49 線程(ThreadPoolExecutor-0_0) 8的平方: 64 64 81
接下來再看一個實例(add_done_callback回調)
import time from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor import random def f(n): time.sleep(random.randint(1, 3)) return n * n def call_back(m): print(m) print(m.result()) if __name__ == '__main__': pool = ThreadPoolExecutor(max_workers=5) pool.submit(f, 2).add_done_callback(call_back)
執行結果:
<Future at 0x2998208 state=finished returned int> 4
帶有回調函數的進程池
from concurrent.futures import ProcessPoolExecutor def func(name): print(name) return 123 def callback(res): print("結束了一個", res.result()) if __name__ == '__main__': p = ProcessPoolExecutor(3) for i in range(5): # 添加到進程池,開啟該進程,並設置回調,當func結束的時候,自動執行callback,並可以直接拿到func函數執行的返回值 p.submit(func, f"進程{i}").add_done_callback(callback) print("主進程")
執行結果:
主進程 進程0 進程1 結束了一個 123 進程2 進程3 結束了一個 123 進程4 結束了一個 123 結束了一個 123 結束了一個 123