请问支持task按组限制qps吗
luodaoyi opened this issue · 15 comments
其实就是一个需求, 我们调用某saas服务, 最高100qps 超过就会封禁一直断时间, 而且此saas的接口的qps限制是共用的
也就是我们写的 一部分task 加起来的qps 不得超过100 但是我们又得让他尽量靠近100 这样可以最大化利用资源
文档我看了两遍
但是好像没有 按组
限制qps的
恳请解答 感谢作者开源,优秀项目
反正celery是不支持此功能的, celery只能单个task限速 没有全局或者分组限速
自己在文档搜索分布式控频,这个框架很容易测试,qps很容易从页面看到,也可以控制台看到,自己写个10行demo验证很容易把。
框架支持单个进程的消费者控频,也支持跨机器消费控频。控频针对的是一个函数。不同的函数之间的qps设置互不干扰
funboost 没有函数组的概念,没有组的概念。例如函数fa和fb,你想控制fa和fb总qps为10,那是做不到的。只能每个函数设置5qps,或者4
+6,3+7
我的意思是 不同功能的task 分成组 然后总体限制一个qps
没有组的概念,qps是针对的一个函数,框架没有组这个概念。
没有组的概念,qps是针对的一个函数,框架没有组这个概念。
那不同的函数 可以用同一个 queue_name 吗
funboost不同的函数不能用同一个queue,和celery不一样。是必须强制不一样的,每个函数用不同的队列,这样做是为了可以获取每个函数还有多少消息,每个函数都随时可以清空自己的队列消息,不影响别的函数的队列。
所有函数都用一个队列,你想清空某个函数的任务就无法做到了,也不能精确知道每个函数还有多少消息
Traceback (most recent call last):
File "D:\sources\cv\supervise_pyworker\consumer.py", line 6, in <module>
from funboost import boost, BrokerEnum, ConcurrentModeEnum
File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\funboost\__init__.py", line 11, in <module>
from funboost.assist.user_custom_broker_register import register_custom_broker
File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\funboost\assist\user_custom_broker_register.py", line 2, in <module>
from funboost.publishers.base_publisher import AbstractPublisher
File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\funboost\publishers\base_publisher.py", line 22, in <module>
from funboost.concurrent_pool import CustomThreadPoolExecutor
File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\funboost\concurrent_pool\__init__.py", line 14, in <module>
from .custom_evenlet_pool_executor import CustomEventletPoolExecutor
File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\funboost\concurrent_pool\custom_evenlet_pool_executor.py", line 7, in <module>
from eventlet import greenpool, monkey_patch, patcher, Timeout
File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\eventlet\__init__.py", line 17, in <module>
from eventlet import convenience
File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\eventlet\convenience.py", line 7, in <module>
from eventlet.green import socket
File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\eventlet\green\socket.py", line 4, in <module>
__import__('eventlet.green._socket_nodns')
File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\eventlet\green\_socket_nodns.py", line 11, in <module>
from eventlet import greenio
File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\eventlet\greenio\__init__.py", line 3, in <module>
from eventlet.greenio.base import * # noqa
File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\eventlet\greenio\base.py", line 32, in <module>
socket_timeout = eventlet.timeout.wrap_is_timeout(socket.timeout)
File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\eventlet\timeout.py", line 166, in wrap_is_timeout
base.is_timeout = property(lambda _: True)
TypeError: cannot set 'is_timeout' attribute of immutable type 'TimeoutError'
跑demo一直报这个错误
不支持python3.10,三方包的问题
所有函数都用一个队列,你想清空某个函数的任务就无法做到了,也不能精确知道每个函数还有多少消息
那这样的话 我感觉只能通过业务task 结合redis 来控制api调用的并发数了
不支持python3.10,三方包的问题
最高支持py多少?
eventlet不支持python3.10,支持3.9
eventlet 我昨天 celery还在用 支持3.10啊
https://pypi.org/project/eventlet/0.33.1/
celery 是尝试导入evetnlet,只有用ecventlet并发模式才会用到。我这是直接导入了,之后我要改成try import,用户不使用这个并发模式,就不直接导入了