根据Django 是同步还是异步。Django 是同步的。但是我用以下方法测试了阻塞视图python manage.py runserver 8100
:
import time
@action(detail=False, methods=['get'])
def test(self, request):
time.sleep(5)
return {}
Run Code Online (Sandbox Code Playgroud)
并在 0 秒、1 秒时向邮递员触发了两个请求,并在 5 秒、6 秒返回。这似乎不是阻塞/同步的。我哪里错了?
即使同步实现通常也会“并行”处理多个请求。
他们通过使用多进程、多线程或它们的组合来实现这一点。
根据服务器的不同,它们具有预定义(固定)数量的进程或线程,或者每当另一个请求需要线程或进程时,它们就会动态分配线程或进程。
另一方面,异步服务器可以仅在一个线程/进程内“并行”处理多个请求。
您可以开始使用的简单开发服务器management.py runserver
默认使用线程。
为了最好地形象化这一点,我建议将您的代码更改为:
import time
import os
import threading
@action(detail=False, methods=['get'])
def test(self, request):
print("START PID", os.getpid(), "TID", threading.get_native_id())
time.sleep(5)
print("STOP PID", os.getpid(), "TID", threading.get_native_id())
return {pid=os.getpid(), tid=threading.get_native_id()}
Run Code Online (Sandbox Code Playgroud)
正如 @xyres 提到的:有一个命令行选项可以禁用线程。
只需运行manage.py runserver --nothreading
并重试即可。现在您应该能够可视化完整的同步行为。
归档时间: |
|
查看次数: |
8331 次 |
最近记录: |