1234567891011121314151617181920212223242526272829303132 |
- import threading
- import psutil
- from django.http import JsonResponse
- from django.utils.deprecation import MiddlewareMixin
- # 使用 psutil 获取系统资源信息
- total_memory_gb = psutil.virtual_memory().total / (1024 ** 3)
- total_cpu_cores = psutil.cpu_count()
- memory_per_request_gb = 128
- cpu_per_request_percentage = 50
- # 计算最大并发数量
- max_concurrency_memory = total_memory_gb // memory_per_request_gb
- max_concurrency_cpu = total_cpu_cores * (100 // cpu_per_request_percentage)
- max_concurrency = min(max_concurrency_memory, max_concurrency_cpu)
- # 设置信号量最大并发数
- semaphore = threading.Semaphore(max_concurrency)
- class ConcurrencyMiddleware(MiddlewareMixin):
- def process_request(self, request):
- if not semaphore.acquire(blocking=False):
- return JsonResponse({'error': 'Server is too busy. Please try again later.'}, status=503)
- def process_response(self, request, response):
- semaphore.release()
- return response
- def process_exception(self, request, exception):
- semaphore.release()
- return None
|