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 获取数据并将其异步发送到其他位置?的主要内容,如果未能解决你的问题,请参考以下文章
需要一个“for循环”来从它们各自的api url获取股票投资组合的股息数据