(十九)区分接口、并发与服务器进程
1. 一个接口名称不决定全部执行方式
WSGI 应用以同步调用返回可迭代响应,服务器可以用线程或进程同时处理多个请求;ASGI 的 await 能在等待可协作的 I/O 时让出当前执行位置。两者都需要服务器安排连接和应用调用。
async 函数里直接执行耗时的同步网络请求、SQLite 调用或大量计算,仍会占住当前执行位置。第八章的线程、进程与异步分工在这里继续适用:先看实际动作怎样等待或计算,再决定执行方式。
本章 make_server 的参考服务器按请求顺序处理,用它观察一次调用。框架中的应用对象与运行它的服务器分别配置,多进程 worker 的数量也由运行方式安排。
2. 进程中的变量与共享数据库
两份 worker 各有自己的 Python 全局变量。如果只把登录信息放在一份全局字典,发到另一进程的请求就找不到那份字典内容。本章把会话放进同一数据库,两份应用按相同编号查询持久记录。
SQLite 的连接也在每个请求内取得并关闭。增加 worker 会改变同时到达的请求数,不会让同一 SQLite 文件自动拥有多条并行写入通道;事务保持在本次业务动作内完成,不让外部网络等待占着已经开始的写事务。