簡體   English   中英

使用Python 3.6 asyncio異步運行任務

[英]Run tasks asynchrounous with Python 3.6 asyncio

我開始研究一個新的Python 3.6項目,該項目與AWS Boto進行通信。 由於asyncio EC2實例需要一些時間,因此我開始使用asyncio庫,但是在理解它方面遇到了一些麻煩。

我想異步啟動2個EC2實例。 但是,如果我調用run_tests ,則會出現以下錯誤:

錯誤:asyncio:任務已銷毀,但未決!

目前這是我的代碼:

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將立即返回。

您可以使用asyncio.gather await許多任務

# ...

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM