因為乙個朋友最近想搞介面壓力測試,推薦了jmeter,因為jmeter開源,且有命令列啟動模式,方便封裝。興起時,自己也簡單實現了一下高併發的指令碼。
一開始想到的採用的是多程序+多執行緒+協程。想法是這樣的,多程序是為了有效利用多核,理論上最好乙個核對應乙個程序比較好;那我為什麼還要用多執行緒呢?不怕gil全域性鎖嗎?當時我是這麼想的,因為我用了gevent處理,請求採用requests,但requests是阻塞的方法,所以我把requests操作丟到協程做,就沒啥問題了。接下來看看指令碼,實現了乙個2000併發量的指令碼(寫的比較爛,不要在意這些細節)
#coding:utf-8
import
multiprocessing
import
requests
import
threading
import
gevent
process_num = 10 #
程序數gevent_num = 10 #
協程數threading_num = 20
defasynchronous(url):
threads =
for i in
range(gevent_num):
gevent.joinall(threads)
defrequest_url(url):
code =requests.get(url).status_code
if code != 200:
"the time request failed:
" +str(code)
else
:
"the time request ok
"def
run_in_thread(url):
threadings =
for i in
xrange(threading_num):
t = threading.thread(target=asynchronous, args=(url,))
t.daemon =true
t.start()
for t in
threadings:
t.join()
if__name__ == '
__main__':
pool = multiprocessing.pool(processes=process_num)
for i in
range(process_num):
"",))
pool.close()
pool.join()
但是這個指令碼是有問題的,因為requests是阻塞方法,因此導致協程其實是無效的,因為它會阻塞直到前乙個協程任務結束,所以需要把requests替換成非同步方法,下面看看替換後的方法。
程序數gevent_num = 10 #
協程數threading_num = 2 #
執行緒數def
不過依然還有問題,但是螢幕輸出的資訊滯後,如果在**裡print,會導致非同步**執行效率降低,為了統計資料,使用了process的manager來在程序中做併發數累積,此時發現隨著執行緒數的增加,併發能力反而降低了,這就是gil鎖的限制了,因此在python2中,使用了協程的話,就不要使用多執行緒了,接下來看看將執行緒改為1後,且加了計數器後的**
程序數gevent_num = 200 #
協程數threading_num = 1 #
執行緒數url = "
輸出結果可以看看
/usr/bin/python2.7 /home/shufeng/workspace/private_project/jobscrawler/center/sample.py3244
cost time: 2.23202705383
process finished with exit code 0
設計乙個高併發系統
公升級過程為 最初系統 新增負載均衡 資料庫分庫分表 讀寫分離 快取集群 訊息中介軟體集群 假設系統機器是4核8g,資料庫伺服器是16核32g。日活使用者1w,系統層面每秒10次請求,資料庫層每秒30次請求。使用者量增長了50倍,日活使用者50萬,高峰期對系統每秒請求500 s,對資料庫的每秒請求1...
SpringBoot初學之乙個簡陋的登入功能
利用springboot和mybatis完成了乙個簡陋到爆的登入功能,沒有什麼價值,但是想記錄一下。org.mybatis.spring.boot mybatis spring boot starter 2.1.1 server.port 8887 spring.datasource.usernam...
如何設計乙個高併發系統
總結如果你確實有真才實學,在網際網路公司裡幹過高併發系統,那你確實拿 offer 基本如探囊取物,沒啥問題。面試官也絕對不會這樣來問你,否則他就是蠢。假設你在某知名電商公司幹過高併發系統,使用者上億,一天流量幾十億,高峰期併發量上萬,甚至是十萬。那麼人家一定會仔細盤問你的系統架構,你們系統啥架構?怎...