Snippet content copied to clipboard.
Are you sure to delete this snippet? No, don't delete
  1. from concurrent.futures import FIRST_COMPLETED, ThreadPoolExecutor, wait
  2. import concurrent.futures
  3. import random
  4. import statistics
  5. import string
  6. import sys
  7. import threading
  8. import time
  9. import requests
  10. HOST = 'http://localhost:9000'
  11. TIMEOUT_s = 1
  12. NUM_REQUESTS = 1000
  13. NUM_CONCURRENT = 5
  14. TIMES = []
  15. def send_request(idx, url, data, headers):
  16. try:
  17. time_before = time.perf_counter()
  18. response = requests.post(
  19. url,
  20. json=data,
  21. headers=headers,
  22. timeout=TIMEOUT_s
  23. )
  24. time_after = time.perf_counter()
  25. if response.status_code != 200:
  26. print(f'Request {idx} failed.')
  27. raise Exception('{response.status_code} NOT 200')
  28. time_duration = time_after - time_before
  29. TIMES.append(time_duration)
  30. except (requests.exceptions.RequestException, concurrent.futures.TimeoutError) as exc:
  31. print(f'Request {idx} failed.')
  32. raise exc
  33. def load_test(url, data_list):
  34. headers = get_headers()
  35. semaphore = threading.BoundedSemaphore(NUM_CONCURRENT)
  36. # Use ThreadPoolExecutor to send requests concurrently
  37. with ThreadPoolExecutor(max_workers=NUM_CONCURRENT) as executor:
  38. # Loop to submit and wait for the requests
  39. for idx, data in enumerate(data_list , 1):
  40. # Acquire the semaphore before submitting the request
  41. success = semaphore.acquire(timeout=TIMEOUT_s)
  42. if not success:
  43. # timeout reached
  44. break
  45. def send_one_request():
  46. send_request(idx, url, data, headers)
  47. semaphore.release()
  48. executor.submit(send_one_request)
  49. print('Done.')
  50. print(f'{len(TIMES)} requests succeeded.')
  51. try:
  52. time_mean = statistics.mean(TIMES)
  53. print(f'Mean: {time_mean:.4f}')
  54. except statistics.StatisticsError:
  55. time_mean = None
  56. print(f'Mean: {time_mean}')
  57. try:
  58. time_max = max(TIMES)
  59. print(f'Max: {time_max:.4f}')
  60. except ValueError:
  61. time_max = 0
  62. print(f'Max: {time_max}')
  63. try:
  64. time_max_index = TIMES.index(time_max)
  65. except ValueError:
  66. time_max_index = None
  67. print(f'Max index: {time_max_index}')

Edit this Snippet