当前位置: 首页 > news >正文

四川省建设科技协会网站h5作品欣赏

四川省建设科技协会网站,h5作品欣赏,wordpress亮相,济南市住建厅官方网站客户端发送http请求进行流量控制 实现方式 1:使用 Semaphore (信号量) 控制流量 asyncio.Semaphore 是一种简单的流控方法,可以用来限制并发请求数量。 import asyncio import aiohttp import timeclass HttpClientWithSemaphore:def __init__(self, …

客户端发送http请求进行流量控制

实现方式 1:使用 Semaphore (信号量) 控制流量

asyncio.Semaphore 是一种简单的流控方法,可以用来限制并发请求数量。

import asyncio
import aiohttp
import timeclass HttpClientWithSemaphore:def __init__(self, max_concurrent_requests=5, request_period=10):self.max_concurrent_requests = max_concurrent_requestsself.request_period = request_periodself.semaphore = asyncio.Semaphore(max_concurrent_requests)self.session = aiohttp.ClientSession()async def fetch(self, url):async with self.semaphore:try:async with self.session.get(url) as response:return await response.text()except Exception as e:print(f"Request failed: {e}")return Noneasync def close(self):await self.session.close()async def main_with_semaphore():client = HttpClientWithSemaphore(max_concurrent_requests=5)urls = ["http://example.com/api/1","http://example.com/api/2","http://example.com/api/3","http://example.com/api/4","http://example.com/api/5","http://example.com/api/6",]tasks = [client.fetch(url) for url in urls]responses = await asyncio.gather(*tasks)for response in responses:if response:print(response)await client.close()if __name__ == "__main__":asyncio.run(main_with_semaphore())

优点

  • 简单易实现,使用内置的 asyncio.Semaphore 就能限制并发请求数量。
  • 易于维护,代码简单清晰。

缺点

  • 缺少精细的流控机制,例如每 10 秒内限制请求数量(只能控制总并发数量)。
  • 难以适应更加复杂的流控需求。

实现方式 2:使用滑动窗口 (Sliding Window) 算法

滑动窗口算法是一种可以精确控制在一定时间内的请求数量的机制。它能平滑地调整速率。

import asyncio
import aiohttp
from collections import deque
import timeclass SlidingWindowRateLimiter:def __init__(self, max_requests, window_seconds):self.max_requests = max_requestsself.window_seconds = window_secondsself.timestamps = deque()async def acquire(self):current_time = time.monotonic()# 清理超出窗口时间的旧请求while self.timestamps and current_time - self.timestamps[0] > self.window_seconds:self.timestamps.popleft()if len(self.timestamps) < self.max_requests:self.timestamps.append(current_time)return Trueelse:# 计算需要等待的时间sleep_time = self.window_seconds - (current_time - self.timestamps[0])await asyncio.sleep(sleep_time)return await self.acquire()class HttpClientWithSlidingWindow:def __init__(self, max_requests_per_period=5, period=10):self.rate_limiter = SlidingWindowRateLimiter(max_requests_per_period, period)self.session = aiohttp.ClientSession()async def fetch(self, url):await self.rate_limiter.acquire()try:async with self.session.get(url) as response:return await response.text()except Exception as e:print(f"Request failed: {e}")return Noneasync def close(self):await self.session.close()async def main_with_sliding_window():client = HttpClientWithSlidingWindow(max_requests_per_period=5, period=10)urls = ["http://example.com/api/1","http://example.com/api/2","http://example.com/api/3","http://example.com/api/4","http://example.com/api/5","http://example.com/api/6",]tasks = [client.fetch(url) for url in urls]responses = await asyncio.gather(*tasks)for response in responses:if response:print(response)await client.close()if __name__ == "__main__":asyncio.run(main_with_sliding_window())

优点

  • 更加精确地控制时间窗口内的请求数量。
  • 平滑控制请求速率,适用于需要稳定流量的情况。

缺点

  • 实现稍复杂,需要维护一个请求时间戳队列。
  • 在极端条件下,如果有大量请求积压,可能会造成延迟波动。

实现方式 3:使用 aiolimiter 第三方库

aiolimiter 是一个专门用于异步流控的 Python 库,支持令牌桶和滑动窗口算法。

安装 aiolimiter

pip install aiolimiter

代码示例

import asyncio
import aiohttp
from aiolimiter import AsyncLimiterclass HttpClientWithAiolimiter:def __init__(self, max_requests_per_period=5, period=10):# 初始化流控器,每10秒允许5个请求self.limiter = AsyncLimiter(max_requests_per_period, period)self.session = aiohttp.ClientSession()async def fetch(self, url):async with self.limiter:try:async with self.session.get(url) as response:return await response.text()except Exception as e:print(f"Request failed: {e}")return Noneasync def close(self):await self.session.close()async def main_with_aiolimiter():client = HttpClientWithAiolimiter(max_requests_per_period=5, period=10)urls = ["http://example.com/api/1","http://example.com/api/2","http://example.com/api/3","http://example.com/api/4","http://example.com/api/5","http://example.com/api/6",]tasks = [client.fetch(url) for url in urls]responses = await asyncio.gather(*tasks)for response in responses:if response:print(response)await client.close()if __name__ == "__main__":asyncio.run(main_with_aiolimiter())

优点

  • 使用方便,aiolimiter 直接支持流控机制。
  • 代码简洁且配置灵活,可直接设置流控参数。
  • 第三方库已经过优化,适合快速开发。

缺点

  • 依赖于外部库,需要额外安装。
  • 灵活性相对有限,无法完全控制算法的细节。

比较总结

实现方式优点缺点适用场景
信号量控制 (Semaphore)简单易实现,易于维护控制粒度较粗,不适合复杂流控适合简单并发控制场景
滑动窗口 (Sliding Window)精确控制时间窗口内的请求数量,平滑控制请求速率实现稍复杂,可能出现延迟波动适合需要精确流控的场景
aiolimiter 第三方库使用方便,代码简洁,库优化良好依赖外部库,灵活性相对有限适合快速实现流控的项目

希望这些不同的实现方式和比较能够帮助你选择适合的 HTTP 客户端实现方案。如果你对某种实现方式有特别的需求或疑问,请随时告知!

http://www.yayakq.cn/news/587874/

相关文章:

  • 泰安可信赖的企业建站公司wordpress社交类主题
  • 织梦本地网站建设教程深圳网站建设哪家最好
  • dreamwearver怎么做静态网站南宁网站推广
  • wap手机网站分享代码网站服务器 数据库服务器
  • 网站建设礼品珠海专业网站建设价格
  • wordpress封装易语言网站建设方式优化
  • 广州网站建设定制方案东莞市建
  • 如何做影视网站设计师网站使用不了
  • 求个网站带图片素材对电子商务专业的认识和了解
  • 网站网站怎么优化关键词排名做故障风的头像的网站
  • 西安的网站制作公司seo技术公司
  • 网站设计客户需求海外营销推广方式
  • 网站的界面设计怎么做网站备案 新网
  • 中国空间站最新动态登不上建设银行网站
  • 服饰网站建设wordpress 做ins
  • 网站建设所需要的软件哪儿提供邯郸做网站
  • 绍兴seo网站推广wordpress最新版本下载
  • 去哪里找做网站的人专做品牌的网站
  • 企业网站排名软件度智能优化google官网入口下载
  • 做微网站是订阅号还是服务号号怎么做网站关键词
  • 国内网站欣赏国外好的设计网站有哪些
  • 做微商代理去哪个网站西安知名网络推广公司
  • 开发公众号 微网站开发wordpress免费模板怎么使用
  • 家居网站建设哪家好免费网站seo诊断
  • 商城站到商城汽车站淘宝客不做网站可以做么
  • 用pycharm做网站觅知网免费素材图库
  • 全网展示型网站建设dw如何制作表格网页
  • 网站域名注册证书是什么asp企业建站系统
  • 网站页头设计门户网站做等级保护测评
  • 水产公司网站源码成都网站开发建设公司