乙個簡陋的高併發請求指令碼的演進過程

2022-04-11 18:38:32 字數 4893 閱讀 1929

因為乙個朋友最近想搞介面壓力測試,推薦了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:

print

"the time request failed:

" +str(code)

else

:

print

"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.py

3244

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 基本如探囊取物,沒啥問題。面試官也絕對不會這樣來問你,否則他就是蠢。假設你在某知名電商公司幹過高併發系統,使用者上億,一天流量幾十億,高峰期併發量上萬,甚至是十萬。那麼人家一定會仔細盤問你的系統架構,你們系統啥架構?怎...