Bad_Coder
Bad_Coder

Reputation: 1019

calculate avg response time from multiple curl commands using python

I am trying to do a load testing of my web server using curl command.

I am able to run multiple curl commands, but now I also want to calculate the avg response time from all the curl command which were executed

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))

output

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

How can i capture the Time and calculate the average response time?

Thanks

Upvotes: 1

Views: 1978

Answers (1)

niemmi
niemmi

Reputation: 17263

Instead of relying to call you could create separate function executed by imap. Then you could use Popen that allows you to communicate with the child process. The example below writes only the time to stdout which is then captured and returned to parent process:

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)

Output:

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

Upvotes: 4

Related Questions