recherche

Maison  >  Questions et réponses  >  le corps du texte

asyncio - python3.5 中使用chain coroutine

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

怪我咯怪我咯2816 Il y a quelques jours968

répondre à tous(1)je répondrai

  • ringa_lee

    ringa_lee2017-04-17 17:56:10

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

    répondre
    0
  • Annulerrépondre