tps_util.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import concurrent.futures
  2. import requests
  3. import time
  4. import statistics
  5. def call_api(url, method, params, json, print_res):
  6. start = time.time()
  7. response = requests.request(method, url, params=params, json=json)
  8. if print_res:
  9. print(response.json())
  10. end = time.time()
  11. return (end - start) * 1000, response.status_code, len(response.content)
  12. def test_api_tps(url, method, params=None, json=None, concurrency=1, duration=1, print_res=False):
  13. successes = 0
  14. failures = 0
  15. times = []
  16. data_lengths = []
  17. with concurrent.futures.ThreadPoolExecutor(max_workers=concurrency) as executor:
  18. start = time.time()
  19. futures = [executor.submit(call_api, url, method, params, json, print_res) for i in range(concurrency)]
  20. while time.time() - start < duration:
  21. completed, futures = concurrent.futures.wait(futures, timeout=0)
  22. for future in completed:
  23. elapsed, status, length = future.result()
  24. times.append(elapsed)
  25. data_lengths.append(length)
  26. if status == 200:
  27. successes += 1
  28. else:
  29. failures += 1
  30. futures.add(executor.submit(call_api, url, method, params, json, print_res))
  31. # Wait for the remaining futures to complete
  32. if futures:
  33. completed, _ = concurrent.futures.wait(futures)
  34. for future in completed:
  35. elapsed, status, length = future.result()
  36. times.append(elapsed)
  37. data_lengths.append(length)
  38. if status == 200:
  39. successes += 1
  40. else:
  41. failures += 1
  42. total = successes + failures
  43. tps = total / duration
  44. mean = statistics.mean(times)
  45. min_time = min(times)
  46. max_time = max(times)
  47. print(f'TPS:{tps}; ', end=' ')
  48. print(f'平均时间(ms): {mean:.0f}; ', end=' ')
  49. print(f'最小时间(ms): {min_time:.0f}; ', end=' ')
  50. print(f'最大时间(ms): {max_time:.0f}; ', end=' ')
  51. print(f'成功数: {successes}; ', end=' ')
  52. print(f'失败数: {failures}; ', end=' ')
  53. print(f'总数据长度: {sum(data_lengths)}; ', end=' ')
  54. if __name__ == '__main__':
  55. test_api_tps('https://httpbin.tianyunperfect.cn/get', 'get', params={"a": 1}, duration=2)