middleware.py 1.1 KB

1234567891011121314151617181920212223242526272829303132
  1. import threading
  2. import psutil
  3. from django.http import JsonResponse
  4. from django.utils.deprecation import MiddlewareMixin
  5. # 使用 psutil 获取系统资源信息
  6. total_memory_gb = psutil.virtual_memory().total / (1024 ** 3)
  7. total_cpu_cores = psutil.cpu_count()
  8. memory_per_request_gb = 128
  9. cpu_per_request_percentage = 50
  10. # 计算最大并发数量
  11. max_concurrency_memory = total_memory_gb // memory_per_request_gb
  12. max_concurrency_cpu = total_cpu_cores * (100 // cpu_per_request_percentage)
  13. max_concurrency = min(max_concurrency_memory, max_concurrency_cpu)
  14. # 设置信号量最大并发数
  15. semaphore = threading.Semaphore(max_concurrency)
  16. class ConcurrencyMiddleware(MiddlewareMixin):
  17. def process_request(self, request):
  18. if not semaphore.acquire(blocking=False):
  19. return JsonResponse({'error': 'Server is too busy. Please try again later.'}, status=503)
  20. def process_response(self, request, response):
  21. semaphore.release()
  22. return response
  23. def process_exception(self, request, exception):
  24. semaphore.release()
  25. return None