从 运行 作为异步任务的函数获取值
Getting values from functions that run as asyncio tasks
我正在尝试以下代码:
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()
我不知道如何从这些函数中获取变量值。我不能这样做:
asyncio.async(a = func_infinite())
因为这会使它成为关键字参数。我该怎么做才能做到这一点?
loop.run_until_complete
returns 由您传递给它的函数编辑的值 return。因此,它将 return 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()
输出:
A
--0
--1
--2
--3
--4
--5
--6
--7
--8
--9
B
return value is saad2
return value is saad
您还可以直接从 tasks
数组访问结果:
print(tasks[0].result())
print(tasks[1].result())
协程按原样工作。只需使用 loop.run_until_complete()
和 call asyncio.gather()
to collect multiple results:
的返回值
#!/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()
输出
--0
--1
--2
--3
--4
--5
--6
--7
--8
--9
A
B
func_normal()=saad, func_infinite()=saad2
如果您想在协程结束后立即使用协程返回的任何值,您可以将未来对象传递给 coro 并通过计算值更新这个未来。一旦 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()
回调函数是用一个参数调用的——它绑定的未来对象。如果您需要将更多参数传递到回调函数中,请使用 functools 包中的部分参数:
future1.add_done_callback(functools.partial(print, "future:", argin))
会打电话
print("future:", argin)
我正在尝试以下代码:
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()
我不知道如何从这些函数中获取变量值。我不能这样做:
asyncio.async(a = func_infinite())
因为这会使它成为关键字参数。我该怎么做才能做到这一点?
loop.run_until_complete
returns 由您传递给它的函数编辑的值 return。因此,它将 return 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()
输出:
A
--0
--1
--2
--3
--4
--5
--6
--7
--8
--9
B
return value is saad2
return value is saad
您还可以直接从 tasks
数组访问结果:
print(tasks[0].result())
print(tasks[1].result())
协程按原样工作。只需使用 loop.run_until_complete()
和 call asyncio.gather()
to collect multiple results:
#!/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()
输出
--0
--1
--2
--3
--4
--5
--6
--7
--8
--9
A
B
func_normal()=saad, func_infinite()=saad2
如果您想在协程结束后立即使用协程返回的任何值,您可以将未来对象传递给 coro 并通过计算值更新这个未来。一旦 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()
回调函数是用一个参数调用的——它绑定的未来对象。如果您需要将更多参数传递到回调函数中,请使用 functools 包中的部分参数:
future1.add_done_callback(functools.partial(print, "future:", argin))
会打电话
print("future:", argin)