python程序池加執行緒池的一些問題

2021-09-29 18:05:15 字數 2468 閱讀 7850

使用程序池加多執行緒的情況可以合理利用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...