fsi*_*i90 13 python asynchronous python-3.x python-asyncio
我有一个异步函数,我想“并行”运行另一个异步函数。但我需要在第一个函数内的某个时刻执行此操作。
我见过很多例子,但它们都同时启动两个功能,这不是我想要的。
我创建了这个简单的示例来说明我想要实现的目标(以及我尝试过的目标):
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')
Run Code Online (Sandbox Code Playgroud)
电流输出:
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
Joh*_*anL 11
您需要异步函数在等待时让出 CPU,以便其他异步函数有机会运行。使用关键字就可以让出 CPU await。此外,您需要使用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')
Run Code Online (Sandbox Code Playgroud)
因此,您实际上要做的就是替换time.sleep(...)为await asyncio.sleep(...).
| 归档时间: |
|
| 查看次数: |
16230 次 |
| 最近记录: |