在剛開始學多程序或多執行緒時,我們迫不及待地基於多程序或多執行緒實現併發的套接字通訊,然而這種實現方式的致命缺陷是:服務的開啟的程序數或執行緒數都會隨著併發的客戶端數目地增多而增多,這會對服務端主機帶來巨大的壓力,甚至於不堪重負而癱瘓,於是我們必須對服務端開啟的程序數或執行緒數加以控制,讓機器在乙個自己可以承受的範圍內執行,這就是程序池或執行緒池的用途,例如程序池,就是用來存放程序的池子,本質還是基於多程序,只不過是對開啟程序的數目加上了限制不說了,直接上**:
from concurrent.futures import threadpoolexecutor,processpoolexecutor
import os,time,random
deftask
(n):
print('%s is runing' %os.getpid())
time.sleep(random.randint(1,3))
return n**2
if __name__ == '__main__':
executor=processpoolexecutor(max_workers=3)
futures=
for i in range(11):
future=executor.submit(task,i)
executor.shutdown(true)
print('+++>')
for future in futures:
print(future.result())
把processpoolexecutor換成threadpoolexecutor,其餘用法全部相同
from concurrent.futures import threadpoolexecutor,processpoolexecutor
from multiprocessing import pool
import requests
import json
import os
defget_page
(url):
print('《程序%s> get %s' %(os.getpid(),url))
respone=requests.get(url)
if respone.status_code == 200:
return
defparse_page
(res):
res=res.result()
print('《程序%s> parse %s' %(os.getpid(),res['url']))
parse_res='url:<%s> size:[%s]\n' %(res['url'],len(res['text']))
with open('db.txt','a') as f:
f.write(parse_res)
if __name__ == '__main__':
urls=[
'','',
'','','']
p=processpoolexecutor(3)
for url in urls:
p.submit(get_page,url).add_done_callback(parse_page) #parse_page拿到的是乙個future物件obj,需要用obj.result()拿到結果
python 執行緒池與程序池
參考文件 為實現程式併發執行和資源共享,提高程式效率,需要進行多執行緒以及多程序開發。在具體介紹之前,需要了解gil.gil是實現python直譯器 cpython 時引入的乙個概念,不是python特性。gil是全域性直譯器鎖,可以控制同一時刻只有乙個執行緒能夠執行,這樣在跑多執行緒的情況下,只有...
執行緒池與程序池
從python3.2開始,標準庫為我們提供了concurrent.futures模組,它提供了threadpoolexecutor和processpoolexecutor兩個類,實現了對threading和multiprocessing的更高階的抽象,是使用非同步實現,充分利用cpu提高程式執行效率...
執行緒池與程序池
為什麼要裝到容器中 可以避免頻繁的建立和銷毀 程序 執行緒 來的資源開銷 可以限制同時存在的執行緒數量 以保證伺服器不會應為資源不足而導致崩潰 幫我們管理了執行緒的生命週期 管理了任務的分配 from concurrent.futures import threadpoolexecutor,proc...