Python 3.x aiohttp 1->;2与gunicorn无法使用超时上下文管理器

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):

在我开始准备部署到Heroku服务器之前,我的小型
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
。但例外情况无论如何都没有帮助。我试图用一小段代码重现错误。