基于tornado的Web应用程序运行有4个分叉子进程,如下所示。
async def post_fork_main():
app = tornado.web.Application([(r'/', MyHandler)])
server = tornado.httpserver.HTTPServer(app)
server.add_sockets(sockets)
await asyncio.Event().wait()
if __name__ == '__main__':
sockets = tornado.netutil.bind_sockets(8080)
tornado.process.fork_processes(4)
print("Service is started successfully ...")
asyncio.run(post_fork_main())
MyHandler 是
class MyHandler(tornado.web.RequestHandler):
async def get(self):
# some other processing code.
await call_api() # reply very slowly.
# some other processing code.
self.write('OK')
当当前 4 个子进程正在等待
all_api()
的响应时,如果有超过 4 个对我的服务的请求,会发生什么? CPU 几乎空闲吗?
请求排队,直到有一个进程准备好处理它们。
您可以自己测试 - 例如,如果
call_api()
的实现是:
async def call_api():
print("Dealing with request")
time.sleep(1)
您可以运行以下 bash 代码,它将同时调用 5 个 API 请求(或者至少不会阻塞和等待响应):
for i in {1..5}
do
curl localhost:8080/ &
done
然后,您将看到服务器立即打印
"Dealing with request"
四次,并且只有在第一个请求返回响应后才会打印第五次。