【发布时间】: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