从作为asyncio任务运行的函数中获取值

Saa*_*eem 40 python python-3.x python-3.4 python-asyncio

我正在尝试以下代码:

import asyncio

@asyncio.coroutine
def func_normal():
        print("A")
        yield from asyncio.sleep(5)
        print("B")
        return 'saad'

@asyncio.coroutine
def func_infinite():
    i = 0
    while i<10:
        print("--"+str(i))
        i = i+1
    return('saad2')

loop = asyncio.get_event_loop()

tasks = [
    asyncio.async(func_normal()),
    asyncio.async(func_infinite())]

loop.run_until_complete(asyncio.wait(tasks))
loop.close()
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何从这些函数中获取变量中的值.我不能这样做:

asyncio.async(a = func_infinite())
Run Code Online (Sandbox Code Playgroud)

因为这会使这成为一个关键字参数.我该如何完成这项工作?

jfs*_*jfs 39

协同程序按原样工作.只需使用返回的值loop.run_until_complete()调用asyncio.gather()以收集多个结果:

#!/usr/bin/env python3
import asyncio

@asyncio.coroutine
def func_normal():
    print('A')
    yield from asyncio.sleep(5)
    print('B')
    return 'saad'

@asyncio.coroutine
def func_infinite():
    for i in range(10):
        print("--%d" % i)
    return 'saad2'

loop = asyncio.get_event_loop()
tasks = func_normal(), func_infinite()
a, b = loop.run_until_complete(asyncio.gather(*tasks))
print("func_normal()={a}, func_infinite()={b}".format(**vars()))
loop.close()
Run Code Online (Sandbox Code Playgroud)

产量

--0
--1
--2
--3
--4
--5
--6
--7
--8
--9
A
B
func_normal()=saad, func_infinite()=saad2
Run Code Online (Sandbox Code Playgroud)


dan*_*ano 8

loop.run_until_complete返回传递给它的函数返回的值.因此,它将返回以下输出asyncio.wait:

import asyncio

@asyncio.coroutine
def func_normal():
    print("A")
    yield from asyncio.sleep(5)
    print("B")
    return 'saad'

@asyncio.coroutine
def func_infinite():
    i = 0
    while i<10:
        print("--"+str(i))
        i = i+1
    return('saad2')

loop = asyncio.get_event_loop()

tasks = [
    asyncio.async(func_normal()),
    asyncio.async(func_infinite())]

done, _ = loop.run_until_complete(asyncio.wait(tasks))
for fut in done:
    print("return value is {}".format(fut.result()))
loop.close()
Run Code Online (Sandbox Code Playgroud)

输出:

A
--0
--1
--2
--3
--4
--5
--6
--7
--8
--9
B
return value is saad2
return value is saad
Run Code Online (Sandbox Code Playgroud)

您还可以直接从tasks阵列访问结果:

print(tasks[0].result())
print(tasks[1].result())
Run Code Online (Sandbox Code Playgroud)


Pet*_*rik 5

如果您想在协程结束后立即使用协程返回的任何值,您可以将 future 对象传递给 coro 并通过计算值更新此 future。一旦 future 更新,它就会将 future.result() 传递给与给定 future 绑定的回调函数。参见下面的代码:

import asyncio


async def func_normal(future):
    print("A")
    await asyncio.sleep(5)
    print("B")
    # return 'saad'
    future.set_result('saad')


async def func_infinite(future):
    i = 0
    while i<10:
        print("--"+str(i))
        i = i+1
    # return('saad2')
    future.set_result('saad2')

def got_result(future):
    print(future.result())

loop = asyncio.get_event_loop()
future1 = asyncio.Future()
future2 = asyncio.Future()

future1.add_done_callback(got_result)
future2.add_done_callback(got_result)

# Coros are automatically wrapped in Tasks by asyncio.wait() 
coros = [
    func_normal(future1),
    func_infinite(future2)]

loop.run_until_complete(asyncio.wait(coros))
loop.close()
Run Code Online (Sandbox Code Playgroud)

使用单个参数调用回调函数 - 与其绑定的 future 对象。如果您需要将更多参数传递到回调中,请使用 functools 包中的部分:

future1.add_done_callback(functools.partial(print, "future:", argin))
Run Code Online (Sandbox Code Playgroud)

将会通知

print("future:", argin)
Run Code Online (Sandbox Code Playgroud)