首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >aiohttp.web + aiopg + sqlalchemy:在加载时随机调用"cursor.execute(),而另一个协程已经在等待传入数据“

aiohttp.web + aiopg + sqlalchemy:在加载时随机调用"cursor.execute(),而另一个协程已经在等待传入数据“
EN

Stack Overflow用户
提问于 2016-11-24 01:05:14
回答 1查看 1.1K关注 0票数 1

我有一个简单的aiohttp.web应用程序,它通过aiopg sqlalchemy集成执行SQL请求。它就像这样简单:

代码语言:javascript
复制
import aiohttp.web
from aiopg.sa import create_engine

app = aiohttp.web.Application()


async def rows(request):
    async with request.app["db"].acquire() as db:
        return aiohttp.web.json_response(list(await db.execute("SELECT * FROM table")))

app.router.add_route("GET", "/rows", rows)


async def init(app):
    app["db"] = await create_engine(host="postgres", user="visio", password="visio", database="visio")

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    handler = app.make_handler()

    loop.run_until_complete(init(app))

    loop.run_until_complete(loop.create_server(handler, "0.0.0.0", 80))
    loop.run_forever()

当服务器负载达到100 rps时,此错误开始随机出现:

代码语言:javascript
复制
RuntimeError: cursor.execute() called while another coroutine is already waiting for incoming data
  File "aiohttp/server.py", line 261, in start
    yield from self.handle_request(message, payload)
  File "aiohttp/web.py", line 88, in handle_request
    resp = yield from handler(request)
  File "visio_longer/views/communicate/__init__.py", line 72, in legacy_communicate
    device = await query_device(db, access_token)
  File "visio_longer/views/communicate/__init__.py", line 31, in query_device
    (Device.access_token == access_token)
  File "aiopg/utils.py", line 72, in __await__
    resp = yield from self._coro
  File "aiopg/sa/connection.py", line 103, in _execute
    yield from cursor.execute(str(compiled), post_processed_params[0])
  File "aiopg/cursor.py", line 103, in execute
    waiter = self._conn._create_waiter('cursor.execute')
  File "aiopg/connection.py", line 186, in _create_waiter
    'already waiting for incoming data' % func_name)

它发生在随机时间的随机查询中,每隔几天就会出现一次,有时这些错误会成堆出现在4个或2个错误中。是不是我的代码有什么问题?aiohttpaiopg版本是pip的最新版本

EN

回答 1

Stack Overflow用户

发布于 2016-11-24 20:22:00

它认为您忘记获取游标

代码语言:javascript
复制
 async with conn.cursor() as cur:
     await cur.execute("SELECT 1")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40770369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档