python3.5 中使用chain coroutine

发布于 2022-09-02 21:00:14 字数 756 浏览 12 评论 0

想在python3.5实现chain coroutine

#!/usr/bin/env python3.5

import sqlite3
import myslice
import json
import asyncio

conn = sqlite3.connect('db.sqlite')
cursor = conn.cursor()

def user():
    cursor.execute("SELECT user_id, config, password from user")
    for row in cursor:
        item = yield row[0], json.loads(row[1]), row[2]

@asyncio.coroutine
def account():
    item = yield from user()
    user_id = item[0]
    # print(user_id)
    # c = yield cursor.execute("SELECT config from account WHERE user_id=%s" %(user_id,))
    # print(c)

def main():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(account())

if __name__ == '__main__':
    main()

但是错误是RuntimeError: Task got bad yield:, 不知道怎么解决

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

坦然微笑 2022-09-09 21:00:14

官方chain coroutine的例子是这样的

import asyncio

async def compute(x, y):
    print("Compute %s + %s ..." % (x, y))
    await asyncio.sleep(1.0)
    return x + y

async def print_sum(x, y):
    result = await compute(x, y)
    print("%s + %s = %s" % (x, y, result))
                
loop = asyncio.get_event_loop()
loop.run_until_complete(print_sum(1, 2))
loop.close()

async 相当于@acyncio.coroutine

很显然楼主的方法达不到实现chain coroutine, 因为协函数要把事情做完的,不能有yield
但可以这样做

#!/usr/bin/env python3.5

import sqlite3
import myslice
import json
import asyncio

conn = sqlite3.connect('db.sqlite')
cursor = conn.cursor()

@asyncio.coroutine
def user():
    ret = []
    cursor.execute("SELECT user_id, config, password from user")
    for row in cursor:
        item = row[0], json.loads(row[1]), row[2]
        ret.append(item)
    return ret

@asyncio.coroutine
def account():
    item = await user()
    user_id = item[0]
    # print(user_id)
    # c = yield cursor.execute("SELECT config from account WHERE user_id=%s" %(user_id,))
    # print(c)

def main():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(account())

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文