asyncio - python3.5 中使用chain coroutine
怪我咯
怪我咯 2017-04-17 17:54:10
0
1
962

想在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:, 不知道怎么解决

怪我咯
怪我咯

走同样的路,发现不同的人生

répondre à tous(1)
左手右手慢动作

L'exemple officiel de coroutine de chaîne est comme ceci

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

équivalent asynchrone à @acyncio.coroutine

Évidemment, la méthode de l'auteur ne peut pas réaliser une coroutine en chaîne, car la cofonction doit terminer le travail et ne peut pas avoir de rendement
Mais cela peut être fait comme ça

#!/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())

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal