Python 3.x aiohttp 1->;2与gunicorn无法使用超时上下文管理器
在我开始准备部署到Heroku服务器之前,我的小型Python 3.x aiohttp 1->;2与gunicorn无法使用超时上下文管理器,python-3.x,gunicorn,python-asyncio,aiohttp,Python 3.x,Gunicorn,Python Asyncio,Aiohttp,在我开始准备部署到Heroku服务器之前,我的小型aiohttp1应用程序一直运行良好。Heroku强迫我使用gunicorn。它无法使用aiohttp1(一些奇怪的错误),经过一次小的迁移aiohttp2之后,我开始使用它 gunicorn app:application --worker-class aiohttp.GunicornUVLoopWebWorker 命令,直到请求调用类的异步方法的视图为止 with async_timeout.timeout(self.timeout):
aiohttp1
应用程序一直运行良好。Heroku强迫我使用gunicorn
。它无法使用aiohttp1
(一些奇怪的错误),经过一次小的迁移aiohttp2
之后,我开始使用它
gunicorn app:application --worker-class aiohttp.GunicornUVLoopWebWorker
命令,直到请求调用类的异步方法的视图为止
with async_timeout.timeout(self.timeout):
res = await self.method()
代码内部并引发运行时错误:超时上下文管理器应在任务内部使用
在上一个成功版本之前唯一改变的是:我正在使用gunicorn
。我正在使用python3.5.2
和uvloop 0.8.0
和gunicorn 19.7.1
出了什么问题,我该如何解决
UPD
问题是我有循环
变量存储新创建的事件循环。此变量定义位于setting.py
文件中,因此在创建aiohttp.web.Application
之前,对下面的代码进行评估:
LOOP = uvloop.new_event_loop()
asyncio.set_evet_loop(LOOP)
这在使用async\u timeout.timeout
上下文管理器时会导致错误
复制错误的代码:
# test.py
from aiohttp import web
import uvloop
import asyncio
import async_timeout
asyncio.set_event_loop(uvloop.new_event_loop())
class A:
async def am(self):
with async_timeout.timeout(timeout=1):
await asyncio.sleep(0.5)
class B:
a = A()
async def bm(self):
await self.a.am()
b = B()
async def hello(request):
await b.bm()
return web.Response(text="Hello, world")
app = web.Application()
app.router.add_get('/', hello)
if __name__ == '__main__':
web.run_app(app, port=5000, host='localhost')
只需运行gunicorn测试:app--worker类aiohttp.GunicornUVLoopWebWorker
(将GunicornWebWorker
与uvloop
事件循环或任何其他组合一起使用时出现相同错误)
解决方案
我已经通过调用
asyncio解决了这个问题。当我需要使用事件循环时,获取事件循环。Heroku不会强迫你使用gunicorn。@dim我可以部署aiohttp
app并将其设置为在特定端口和主机上侦听?你能告诉我更多吗?你可能希望主机是0.0.0.0,端口需要是Heroku设置的port
环境变量,但是是的。这是一个错误。这个错误很奇怪。你能提供一个重现问题的代码吗?@AndrewSvetlov今天我继续配置部署,应用程序运行良好。过了一会儿,我明白了我的循环设置有问题:在创建应用程序之前,我正在我的settings.py
中创建新的uvloop
。但例外情况无论如何都没有帮助。我试图用一小段代码重现错误。Heroku不会强迫您使用gunicorn。@我可以部署aiohttp
应用程序,并将其设置为在特定端口和主机上侦听吗?你能告诉我更多吗?你可能希望主机是0.0.0.0,端口需要是Heroku设置的port
环境变量,但是是的。这是一个错误。这个错误很奇怪。你能提供一个重现问题的代码吗?@AndrewSvetlov今天我继续配置部署,应用程序运行良好。过了一会儿,我明白了我的循环设置有问题:在创建应用程序之前,我正在我的settings.py
中创建新的uvloop
。但例外情况无论如何都没有帮助。我试图用一小段代码重现错误。