压测一个接口
import requests
import threading
import time
from queue import Queue
import statistics
import numpy as np
URL = "http://example.com"
POST_DATA = {"key": "value"}
REQUESTS_PER_SECOND = 10
SECONDS_TO_RUN = 3
response_queue = Queue()
request_counts = [0] * SECONDS_TO_RUN
response_counts = [0] * SECONDS_TO_RUN # 添加响应计数列表
response_times = [[] for _ in range(SECONDS_TO_RUN)]
def send_post_request(url, data, queue, request_count, response_count, response_time, second):
start_time = time.time()
response = requests.post(url, data=data)
end_time = time.time()
response_time.append(end_time - start_time)
queue.put(response)
request_count[second] += 1
response_count[second] += 1 # 每收到一个响应,相应秒的计数加1
def main():
threads = []
for second in range(SECONDS_TO_RUN):
for _ in range(REQUESTS_PER_SECOND):
thread = threading.Thread(target=send_post_request, args=(
URL, POST_DATA, response_queue, request_counts, response_counts, response_times[second], second))
thread.start()
threads.append(thread)
time.sleep(1)
print(
f"Second {second + 1}: Requests sent: {request_counts[second]}, Responses received: {response_counts[second]}, Median response time: {statistics.median(response_times[second])}")
print(
f"Percentiles: 50th: {np.percentile(response_times[second], 50)}, 90th: {np.percentile(response_times[second], 90)}, 95th: {np.percentile(response_times[second], 95)}, 99th: {np.percentile(response_times[second], 99)}")
response_times[second].clear()
request_counts[second] = 0
response_counts[second] = 0 # 重置响应计数
for thread in threads:
thread.join()
if __name__ == "__main__":
main()