我正在使用Sanic作为服务器并尝试同时处理多个请求。
我已经使用了await作为编码函数(我使用for循环来模拟做某事),但是当我在两个单独的控制台中尝试时间curl http://0.0.0.0:8000/
时,它不会同时运行。
我搜索了google,但只找到了event_loop,但它是为了调度注册的并发例程。
如何等待 for 循环以使请求不会被阻止?
谢谢。
from sanic import Sanic
from sanic import response
from signal import signal, SIGINT
import asyncio
import uvloop
app = Sanic(__name__)
@app.route("/")
async def test(request):
# await asyncio.sleep(5)
await encode()
return response.json({"answer": "42"})
async def encode():
print('encode')
for i in range(0, 300000000):
pass
asyncio.set_event_loop(uvloop.new_event_loop())
server = app.create_server(host="0.0.0.0", port=8000)
loop = asyncio.get_event_loop()
task = asyncio.ensure_future(server)
signal(SIGINT, lambda s, f: loop.stop())
try:
loop.run_forever()
except:
loop.stop()
最佳答案
运行for i in range()
会阻塞。如果您将其更改为将 await asyncio.sleep(5)
放入 encode
方法中,您将看到它按预期运行。
@app.route("/")
async def test(request):
await encode()
return response.json({"answer": "42"})
async def encode():
print('encode')
await asyncio.sleep(5)
当你调用awaitencode()
并且encode是一个阻塞方法时,它仍然会阻塞,因为你没有“等待”任何其他东西。您的线程仍然被锁定。
您还可以添加其他工作人员:
app.create_server(worker=2)
尝试查看this answer
关于Python 等待一个内部有循环的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49094459/