Python:如何创建一个函数来从 url 获取数据并将其异步发送到其他位置?

Posted

技术标签:

【中文标题】Python:如何创建一个函数来从 url 获取数据并将其异步发送到其他位置?【英文标题】:Python: How to create a function to get a data from url and send it to other location asynchronously? 【发布时间】: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://***.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())

我采取的方法正确吗?

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

【问题讨论】:

【参考方案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:.3fsec'.format(end - begin))

【讨论】:

ensure_future 是否让协程不等待?那么花费的时间和你的和我的没有什么不同。我说的对吗? 是的,我之前被推荐使用 ensure_futrue,但我不明白不使用该方法的确切区别。抱歉,我还需要异步专家

以上是关于Python:如何创建一个函数来从 url 获取数据并将其异步发送到其他位置?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 从多个 URL 获取站点标题

需要一个“for循环”来从它们各自的api url获取股票投资组合的股息数据

查询从 URL 读取数据

如何从fetch获取响应值而不是没有值的promise?

在 python BeautifulSoup 上获取带有特定前缀的超链接

是否可以编写一个函数来从 data.frame 对象创建栅格文件?