Django ORM数据库查询是否阻止服务器,还是异步?

Raf*_*ski 4 database django orm asynchronous twisted

我只想澄清一些事情.

我相信Django服务器是异步工作的(因为如果来自客户端的每个请求都会阻塞服务器,那么它将无法工作),但我也知道Django ORM不是异步的.那么对数据库的查询会阻塞服务器吗?(我的意思是休息请求等待查询完成?)或者它可能完全不同,我误解了它.

我问这个是因为我听说大多数ORM是阻塞的,因此我不能在我的Twisted服务器中使用它们从db获取数据而不会阻塞扭曲.

Mar*_*ers 7

为什么服务器需要异步工作?Django是一个WSGI应用程序; 并发模型取决于您运行它的服务器,可以是线程,多处理,异步(选择循环驱动)或它们的组合.

每个Django请求本身都是完全同步的.查询数据库会阻止请求,直到返回结果.它不需要知道其他并发请求(除了确保Django以线程安全的方式处理数据结构).

  • "为什么服务器需要异步工作?" 好吧因为那时你可以对类似套接字的对象(如数据库,REST API和文件)上的不同数据源发出几个并行请求,然后产生的结果可能比串行执行多个同步操作要快得多. (3认同)
  • @Sniggerfardimungus:当然,这就是为什么要配置WSGI服务器以使用线程和/或多处理.问题是假设Django需要以某种方式处理并发.它没有开箱即用,它将它留给了WSGI*服务器*(其中Django是插入该服务器的WSGI应用程序).这并不是说你不能在请求处理程序中添加异步处理,请参阅[Django Workload项目代码库](https://github.com/Instagram/django-workload/blob/master/django-workload/django_workload/ feed.py)用于asyncio示例.免责声明,我写了那段代码. (3认同)