使用程序池加多執行緒的情況可以合理利用cpu,但是 會有些問題:
from multiprocessing import pool
import threading
import requests
def test1():
s=requests.session()#使用連線池訪問,共用io復用
for i in range(10000):
try:
rep=s.get("")
print "test1"
except:
continue
def test2():
s=requests.session()
for i in range(10000):
try:
rep=s.get("")
print "test2"
except:
continue
def coroutine():
t1 = threading.thread(target=test1)
t2 = threading.thread(target=test2)
t1.start()
t2.start()
t1.join()
t2.join()
if __name__=="__main__":
p=pool()
for i in range(4):
p.close()
p.join()
上面有幾個坑,
首先看下執行緒樹:
python(16884)─┬─python(16889)─┬─(16896)
│ └─(16898)
├─python(16890)─┬─(16897)
│ └─(16899)
├─python(16891)─┬─(16900)
│ └─(16901)
├─python(16892)─┬─(16902)
│ └─(16903)
├─(16893)
├─(16894)
└─(16895)
第乙個是 ,不使用io復用,或者說,不使用requests的seesion,保持長連線的話, 使用strace抓包如下:
root@wan-thinkpad-e450c:/home/wan/ceshi# strace -p 28501 -e trace=connect
strace: process 28501 attached
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, , 16) = 0
connect(6, {sa_family=af_inet, sin_port=htons(80), sin_addr=inet_addr("183.
每個執行緒會瘋狂的建立連線,這裡,有可能耗盡連線。
第二個,這裡是否有類似pipeline的方式,批量發請求,針對資料庫。
第三個,這裡ctrl +c 已經不能正常退出了。使用join會掛起主程序,而訊號只有主程序能接受,而join後的主程序,根本就接受不到。
有些比較大的程式,比如datadog,通常做法是啟動時,將pid寫到pid檔案中,程式響應stop的時候,去pid檔案中取pid,然後kill 掉自身。
還有種思路是:設定子執行緒為daemon執行緒,啟動子執行緒後主執行緒呼叫is_alive的方法手動模擬join過程。
最後,其實靠ctrc+c的方式stop,並不是很常見的做法,一般將主程序寫成守護程序。
第四個,是沒超時控制,比如watchdog的方式,控制重啟程序池。
第五個,如果kill掉主程序,會使子程序成為孤兒程序。設定daemon關鍵字可以使主程序退出時子程序一起退出。
第六個,這裡輸出是stdio,而生產中是輸出到log,要考慮多程序,執行緒日誌同步的問題。
python 執行緒池與程序池
參考文件 為實現程式併發執行和資源共享,提高程式效率,需要進行多執行緒以及多程序開發。在具體介紹之前,需要了解gil.gil是實現python直譯器 cpython 時引入的乙個概念,不是python特性。gil是全域性直譯器鎖,可以控制同一時刻只有乙個執行緒能夠執行,這樣在跑多執行緒的情況下,只有...
程序池 執行緒池
程序池和執行緒池相似,所以這裡我們以程序池為例介紹,下面對程序池的討論完全適用於執行緒池 如果沒有特殊宣告 程序池是由伺服器預先建立的一組子程序,這些子程序的數目在3 10個之間 典型情況 執行緒池的數量應該和cpu數量差不多。程序池中的所有子程序都執行者相同的 並具有相同的屬性。因為程序池在伺服器...
執行緒池 程序池
執行緒池 程序池 池子解決什麼問題?1.建立 銷毀執行緒伴隨著系統開銷,如果過於頻繁會影響系統執行效率 2.執行緒併發數量過多,搶占系統資源,從而導致系統阻塞甚至宕機 3.能夠剛好的控制和管理池子裡面的執行緒和程序 concurrent.futures模組提供了高度封裝的非同步呼叫介面 thread...