1. 程式人生 > >python 之 進程池與線程池

python 之 進程池與線程池

add __main__ .get 異步 範圍 功能 能力 並發 cut

1.什麽時候用池?

池的功能是限制啟動的進程數或線程數。

什麽時候應該限制?

當並發的任務數遠遠超過了計算機的承受能力時,即無法一次性開啟過多的進程數或線程數時

就應該用池的概念將開啟的進程數或線程數限制在計算機可承受的範圍內


2.同步 vs 異步

同步,異步指的是提交任務的兩種方式

同步:提交完任務後就在原地等待,直到任務運行完畢後拿到任務的返回值,再繼續運行下一行代碼

異步:提交完任務(綁定一個回調函數)後根本就不在原地等待,直接運行下一行代碼,等到任務有返回值後會自動觸發回調函數。



進程池:

# from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
# import os
# import time
# import random
#
# def task(n):
# print(‘%s run...‘ %os.getpid())
# time.sleep(5)
# return n**2
#
# def parse(future):
# time.sleep(1)
# res=future.result()
# print(‘%s 處理了 %s‘ %(os.getpid(),res))
#
# if __name__ == ‘__main__‘:
# pool=ProcessPoolExecutor(4)
# # pool.submit(task,1)
# # pool.submit(task,2)
# # pool.submit(task,3)
# # pool.submit(task,4)
#
# start=time.time()
# for i in range(1,5):
# future=pool.submit(task,i)
# future.add_done_callback(parse) # parse會在futrue有返回值時立刻觸發,並且將future當作參數傳給parse
# pool.shutdown(wait=True)
# stop=time.time()
# print(‘主‘,os.getpid(),(stop - start))




線程池:


from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
from threading import current_thread
import os
import time
import random

def task(n):
print(‘%s run...‘ %current_thread().name)
time.sleep(5)
return n**2

def parse(future):
time.sleep(1)
res=future.result()
print(‘%s 處理了 %s‘ %(current_thread().name,res))

if __name__ == ‘__main__‘:
pool=ThreadPoolExecutor(4)
start=time.time()
for i in range(1,5):
future=pool.submit(task,i)
future.add_done_callback(parse) # parse會在futrue有返回值時立刻觸發,並且將future當作參數傳給parse
pool.shutdown(wait=True)
stop=time.time()
print(‘主‘,current_thread().name,(stop - start))











python 之 進程池與線程池