我有一个异步功能,我想“并行”运行另一个。但是我需要在第一个函数中的某个特定时间执行此操作。
我已经看到了很多示例,但是所有这些示例都同时启动了两个函数,而这并不是我想要的。
我创建了这个简单的示例来说明我想要实现的目标(以及我尝试过的目标):
import asyncio
import time
async def print_letters():
for letter in ['A', 'B', 'C', 'D']:
print(letter)
time.sleep(1)
async def print_numbers(loop):
for number in range(1, 7):
if(number == 3):
# same result with create_task
# loop.create_task(print_letters())
asyncio.ensure_future(print_letters())
print(number)
time.sleep(1)
loop = asyncio.get_event_loop()
loop.run_until_complete(print_numbers(loop))
print('End')
当前输出:
1,2,3,4,5,6,A,B,C,D,结束
所需的输出将是这样的:
1,2,3,A,4,B,5,C,6 D,末端
我尝试了其他一些东西(例如
asyncio.wait
),但没有一个按预期工作。另外,当您使用Python asyncio
较新时,很难理解文档。如果问题不清楚或缺少某些内容,请告诉我,以便我进行编辑。我感谢任何帮助。
的Python 3.6.2
最佳答案
您需要异步函数来在等待时释放CPU,以便其他异步函数有运行的机会。使用await
关键字完成CPU的生成。另外,您需要使用在sleep(...)
中定义的asyncio
功能,因为普通的time.sleep(...)
不允许重新输入产生的功能。总而言之,这要求您的程序必须
import asyncio
async def print_letters():
for letter in ['A', 'B', 'C', 'D']:
print(letter)
await asyncio.sleep(1)
async def print_numbers(loop):
for number in range(1, 7):
if(number == 3):
# same result with create_task
# loop.create_task(print_letters())
asyncio.ensure_future(print_letters())
print(number)
await asyncio.sleep(1)
loop = asyncio.get_event_loop()
loop.run_until_complete(print_numbers(loop))
print('End')
因此,您实际上要做的就是将
time.sleep(...)
替换为await asyncio.sleep(...)
。