【问题标题】:asyncio run until complete not forever异步运行直到完成而不是永远
【发布时间】:2020-06-10 20:50:04
【问题描述】:

谁能给我一个关于如何运行 asyncio 脚本以在完成时停止的提示?我知道这与我将主循环设置为运行方式有关...在完整代码的这一部分中,但是我从网上可以找到的任何尝试都行不通。

loop = asyncio.get_event_loop()

try:
    asyncio.ensure_future(firstWorker())
    asyncio.ensure_future(secondWorker())
    loop.run_forever()

下面的脚本只是在脚本完成时尝试将随机数据编译成 pandas 数据帧但我无法完成它!任何提示都非常感谢...

完整代码:

import asyncio
import pandas as pd
from datetime import datetime
import random


data = []

async def firstWorker():
    for _ in range(5):
        await asyncio.sleep(1)

        things = {}

        stamp = datetime.now()

        temperature1 = (random.random() * 20) - 5
        print(temperature1)

        things['Date'] = stamp
        things['temperature1'] = temperature1

        data.append(things)



async def secondWorker():
    for _ in range(5):
        await asyncio.sleep(1)

        stuff = {}

        stamp = datetime.now()

        temperature2 = (random.random() * 40) - 15
        print(temperature2)

        stuff['Date'] = stamp
        stuff['temperature2'] = temperature2


        data.append(stuff)



loop = asyncio.get_event_loop()

try:
    asyncio.ensure_future(firstWorker())
    asyncio.ensure_future(secondWorker())
    loop.run_forever()

except KeyboardInterrupt:
    pass

finally:
    print("Closing Loop")
    loop.close()


    master_data = pd.DataFrame(data)
    master_data.columns = ['Date','temperature1','temperature2']

    master_data.to_csv('master_data.csv')

【问题讨论】:

    标签: python pandas python-asyncio


    【解决方案1】:

    您可能想要asyncio.gatherrun_until_complete

    async def main():
        await asyncio.gather(firstWorker(), secondWorker())
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()
    

    【讨论】:

    • 如果您关心结果的顺序,您可能希望使用asyncio.gather 而不是asyncio.wait。见stackoverflow.com/questions/34377319/…
    • 如果您使用的是 python >= 3.7,您可以将最后 3 行简化为 asyncio.run(main())。见stackoverflow.com/questions/52796630/…
    • 像这样使用 asyncio.wait 会使异常静默传递。请改用 asyncio.gather。
    • 在主循环中,async def main(): await asyncio.gather([firstWorker(), secondWorker()]) 如果我使用asyncio.gather 而不是asyncio.wait 这将引发异常..
    • `Traceback(最近一次调用最后):文件“asyncioRand.py”,第 51 行,在 loop.run_until_complete(main()) 文件“C:\Users\benb\AppData\ Local\Continuum\anaconda3\lib\asyncio\base_events.py”,第 584 行,在 run_until_complete 返回 future.result() 文件“asyncioRand.py”,第 48 行,在 main await asyncio.gather([firstWorker(), secondWorker( )]) 文件“C:\Users\benb\AppData\Local\Continuum\anaconda3\lib\asyncio\tasks.py”,第 718 行,如果 arg 不在 arg_to_fut 中:TypeError: unhashable type: 'list'跨度>
    猜你喜欢
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多