【问题标题】:How does Django handles multiple requestDjango如何处理多个请求
【发布时间】:2021-05-25 05:48:49
【问题描述】:

这不是this question的副本

我试图了解 django 如何处理多个请求。根据this answer django 应该阻止并行请求。但我发现这并不完全正确,至少对于 django 3.1。我正在使用 django 内置服务器。

所以,在我的代码(view.py)中,我有一个阻塞代码块,它只在特定情况下触发。完成此案的请求需要很长时间。这是 view.py 的代码

from django.shortcuts import render
import numpy as np

def insertionSort(arr): 
  for i in range(1, len(arr)): 
    key = arr[i] 
    j = i-1
    while j >=0 and key < arr[j] : 
            arr[j+1] = arr[j] 
            j -= 1
    arr[j+1] = key

def home(request):
   a = request.user.username
   print(a)
   id = int(request.GET.get('id',''))

   if id ==1:
       arr = np.arange(100000)
       arr = arr[::-1]
       insertionSort(arr) 
       # print ("Sorted array is:") 
       # for i in range(len(arr)): 
       #     print ("%d" %arr[i]) 
   return render(request,'home/home.html')

所以只有 id=1 才会执行阻塞代码块。但对于其他情况,它应该可以正常工作。

现在,我发现,如果我发出两个多个请求,一个 id=1,另一个 id=2,第二个请求并没有真正被阻塞,而是需要更长的时间才能从 django 获取数据。如果有另一个并行阻塞请求,则需要 ~2.5s 才能完成。否则,获取数据需要 ~0.02s

这些是我发出请求的python代码:

恶意请求:

from concurrent.futures import as_completed
from pprint import pprint
from requests_futures.sessions import FuturesSession

session = FuturesSession()

futures=[session.get(f'http://127.0.0.1:8000/?id=1') for i in range(3)]
start = time.time()
for future in as_completed(futures):
    resp = future.result()
    # pprint({
    #     'url': resp.request.url,
    #     'content': resp.json(),
    # })

roundtrip = time.time() - start
print (roundtrip)

正常请求:

import logging
import threading
import time
import requests

if __name__ == "__main__":
    
    # start = time.time()
    while(True):
        print(requests.get("http://127.0.0.1:8000/?id=2").elapsed.total_seconds())
        time.sleep(2)

如果有人能解释一下 Django 在这种情况下如何处理并行请求,我将不胜感激。

【问题讨论】:

    标签: python django parallel-processing django-wsgi


    【解决方案1】:

    当您启动服务器时,可以选择使用--nothreading。根据您的描述,阻塞任务可能在 2 秒内完成。更简单的测试方法是使用 time.sleep(10) 进行测试。

    【讨论】:

    • 阻塞任务需要2s以上才能完成,这是肯定的。我单独为阻塞请求计时以确保这一点。
    • 您是否尝试过使用--nothreading 选项运行?我记得它不是很健壮,所以不建议使用内置服务器进行部署。
    猜你喜欢
    • 2018-08-19
    • 2021-12-21
    • 1970-01-01
    • 2013-01-12
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    相关资源
    最近更新 更多