【问题标题】:Python: How to create a function to get a data from url and send it to other location asynchronously?Python:如何创建一个函数来从 url 获取数据并将其异步发送到其他位置?
【发布时间】:2021-12-22 07:02:16
【问题描述】:

我试图理解异步编程。

所以我做了一个小的异步函数。

我做的功能是从多个网站读取内容并异步发送到特定的url。

我写了一个类似这样的异步函数

import requests
import asyncio

getter_sender_list = [
    ('https://google.com', 'http://localhost:5000/receiver_1'),
    ('https://yahoo.com', 'http://localhost:5000/receiver_2'),
    ('https://stackoverflow.com', 'http://localhost:5000/receiver_3'),
]

def main():
    async def transfer_data(getter, sender):
        r = await loop.run_in_executor(None, requests.get(getter))
        data = r.content
        res = await loop.run_in_executor(None, requests.post(sender, data=data))
        print('Single Transfer Complete')

    async def transfer_all():
        coroutines = [transfer_data(getter, sender) for getter, sender in getter_sender_list]
        await asyncio.gather(*coroutines)
        print('TRANSFER COMPLETE')

    loop = asyncio.get_event_loop()
    loop.run_until_complete(transfer_all())

我采取的方法正确吗?

还是我需要考虑一些不同的东西?

【问题讨论】:

    标签: python python-asyncio


    【解决方案1】:

    我认为协程需要像这样改变

    coroutines = [asyncio.ensure_future(transfer_data(getter, sender)) for getter, sender in getter_sender_list]
    
    

    您可以检查代码是否与时间异步运行

    from time import time
    
    begin = time()
    loop = asyncio.get_event_loop()          
    loop.run_until_complete(transfer_all())          
    loop.close()                             
    end = time()
    print('running time: {0:.3f}sec'.format(end - begin))
    

    【讨论】:

    • ensure_future 是否让协程不等待?那么花费的时间和你的和我的没有什么不同。我说的对吗?
    • 是的,我之前被推荐使用 ensure_futrue,但我不明白不使用该方法的确切区别。抱歉,我还需要异步专家
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2021-12-21
    • 2012-08-16
    • 2021-08-15
    相关资源
    最近更新 更多