2016-09-14 23 views
0

我正在嘗試使用curl命令對我的web服務器進行負載測試。使用python計算來自多個curl命令的avg響應時間

我能夠運行多個捲曲的命令,但現在我也想從所有被執行curl命令計算平均響應時間

from functools import partial 
from multiprocessing.dummy import Pool 
from subprocess import call 

commands = [] 
command = "curl -s -w \"Time:%{time_total}\n\" -o /dev/null -k -X GET \"https://google.com\"" 
for i in range(10): # run 10 curl commands in total 
    commands.append(command) 

pool = Pool(5) # Nummber of concurrent commands at a time 
for i, returncode in enumerate(pool.imap(partial(call, shell=True), commands)): 
    if returncode != 0: 
     print("%d command failed: %d" % (i, returncode)) 

輸出

Time:0.654 
Time:0.689 
Time:0.720 
Time:0.725 
Time:0.735 
Time:0.624 
Time:0.635 
Time:0.633 
Time:0.678 
Time:0.708 

哪有我捕獲Time並計算平均響應時間?

感謝

回答

1

而不是依賴於call您可以創建由imap執行獨立的功能。然後你可以使用Popen,它允許你與子進程進行通信。下面的例子只有一次寫入stdout,然後將其捕獲並返回到父進程:

from functools import partial 
from multiprocessing.dummy import Pool 
from subprocess import Popen, PIPE 

def child(cmd): 
    p = Popen(cmd, stdout=PIPE, shell=True) 
    out, err = p.communicate() 
    return out, p.returncode 

commands = [] 
command = "curl -s -w \"%{time_total}\" -o /dev/null -k -X GET \"https://google.com\"" 
for i in range(10): # run 10 curl commands in total 
    commands.append(command) 

pool = Pool(5) # Nummber of concurrent commands at a time 

times = [] 
for i, (output, returncode) in enumerate(pool.imap(child, commands)): 
    if returncode != 0: 
     print("{} command failed: {}".format(i, returncode)) 
    else: 
     print("{} success: {}".format(i, output)) 
     times.append(float(output)) 

print 'Average: {}'.format(sum(times)/len(times) if times else 0) 

輸出:

0 success: 0.109 
1 success: 0.108 
2 success: 0.103 
3 success: 0.093 
4 success: 0.085 
5 success: 0.091 
6 success: 0.109 
7 success: 0.114 
8 success: 0.092 
9 success: 0.099 
Average: 0.1003 
+0

這是真棒! :) –