运行 任务与 Python 3.6 asyncio 异步
Run tasks asynchrounous with Python 3.6 asyncio
我开始研究一个与 AWS Boto 通信的新 Python 3.6 项目。由于启动 EC2 实例需要一些时间,我开始使用 asyncio
库,但我在理解它时遇到了一些麻烦。
我想异步启动 2 个 EC2 实例。但是,如果我调用 run_tests
我会收到以下错误:
ERROR:asyncio:Task was destroyed but it is pending!
这是我目前的代码:
from manager import Manager
import asyncio
async def run_new_vm(manager, loop, vm_name):
new_instance = manager.launch_ec2_instance(vm_name)
task = loop.create_task(new_instance)
task.add_done_callback(lambda f: do_something(manager, f.result()))
def do_something(manager, instance):
// Do stuff once the instance is usable
async def one_service_per_vm(n, manager, loop):
for x in range (0, n):
print('Started with number %s.' % x)
loop.create_task(run_new_vm(manager, loop, n))
def run_tests():
loop = asyncio.get_event_loop()
m = Manager()
loop.run_until_complete(one_service_per_vm(2, m, loop))
loop.close()
我做错了什么?
您正在使用 create_task
循环安排作业,但没有等待它们完成。 one_service_per_vm
将立即 return。
您可以 await
使用 asyncio.gather
完成许多任务
# ...
async def one_service_per_vm(n, manager, loop):
tasks = [run_new_vm(manager, loop, n) for x in range (0, n)]
await asyncio.gather(*tasks, loop=loop)
def run_tests():
loop = asyncio.get_event_loop()
m = Manager()
loop.run_until_complete(one_service_per_vm(2, m, loop))
loop.close()
我开始研究一个与 AWS Boto 通信的新 Python 3.6 项目。由于启动 EC2 实例需要一些时间,我开始使用 asyncio
库,但我在理解它时遇到了一些麻烦。
我想异步启动 2 个 EC2 实例。但是,如果我调用 run_tests
我会收到以下错误:
ERROR:asyncio:Task was destroyed but it is pending!
这是我目前的代码:
from manager import Manager
import asyncio
async def run_new_vm(manager, loop, vm_name):
new_instance = manager.launch_ec2_instance(vm_name)
task = loop.create_task(new_instance)
task.add_done_callback(lambda f: do_something(manager, f.result()))
def do_something(manager, instance):
// Do stuff once the instance is usable
async def one_service_per_vm(n, manager, loop):
for x in range (0, n):
print('Started with number %s.' % x)
loop.create_task(run_new_vm(manager, loop, n))
def run_tests():
loop = asyncio.get_event_loop()
m = Manager()
loop.run_until_complete(one_service_per_vm(2, m, loop))
loop.close()
我做错了什么?
您正在使用 create_task
循环安排作业,但没有等待它们完成。 one_service_per_vm
将立即 return。
您可以 await
使用 asyncio.gather
# ...
async def one_service_per_vm(n, manager, loop):
tasks = [run_new_vm(manager, loop, n) for x in range (0, n)]
await asyncio.gather(*tasks, loop=loop)
def run_tests():
loop = asyncio.get_event_loop()
m = Manager()
loop.run_until_complete(one_service_per_vm(2, m, loop))
loop.close()