funboost 49.5__py3-none-any.whl → 49.7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of funboost might be problematic. Click here for more details.

Files changed (37) hide show
  1. funboost/__init__.py +1 -1
  2. funboost/beggar_version_implementation/beggar_redis_consumer.py +3 -1
  3. funboost/constant.py +39 -3
  4. funboost/consumers/base_consumer.py +34 -7
  5. funboost/consumers/celery_consumer.py +1 -0
  6. funboost/consumers/empty_consumer.py +12 -1
  7. funboost/consumers/faststream_consumer.py +1 -1
  8. funboost/consumers/http_consumer.py +12 -7
  9. funboost/consumers/kafka_consumer_manually_commit.py +0 -2
  10. funboost/consumers/kombu_consumer.py +0 -50
  11. funboost/consumers/tcp_consumer.py +11 -10
  12. funboost/consumers/udp_consumer.py +9 -6
  13. funboost/consumers/zeromq_consumer.py +18 -11
  14. funboost/core/exceptions.py +7 -0
  15. funboost/core/func_params_model.py +16 -7
  16. funboost/core/function_result_status_saver.py +15 -0
  17. funboost/core/msg_result_getter.py +51 -1
  18. funboost/core/serialization.py +28 -1
  19. funboost/factories/consumer_factory.py +1 -1
  20. funboost/factories/publisher_factotry.py +1 -1
  21. funboost/funboost_config_deafult.py +3 -2
  22. funboost/function_result_web/__pycache__/app.cpython-39.pyc +0 -0
  23. funboost/publishers/base_publisher.py +16 -2
  24. funboost/publishers/http_publisher.py +7 -1
  25. funboost/publishers/tcp_publisher.py +10 -8
  26. funboost/publishers/udp_publisher.py +8 -6
  27. funboost/publishers/zeromq_publisher.py +5 -1
  28. funboost/timing_job/apscheduler_use_redis_store.py +18 -4
  29. funboost/timing_job/timing_push.py +3 -1
  30. funboost/utils/ctrl_c_end.py +1 -1
  31. funboost/utils/redis_manager.py +6 -4
  32. {funboost-49.5.dist-info → funboost-49.7.dist-info}/METADATA +168 -173
  33. {funboost-49.5.dist-info → funboost-49.7.dist-info}/RECORD +37 -37
  34. {funboost-49.5.dist-info → funboost-49.7.dist-info}/WHEEL +1 -1
  35. {funboost-49.5.dist-info → funboost-49.7.dist-info}/LICENSE +0 -0
  36. {funboost-49.5.dist-info → funboost-49.7.dist-info}/entry_points.txt +0 -0
  37. {funboost-49.5.dist-info → funboost-49.7.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: funboost
3
- Version: 49.5
3
+ Version: 49.7
4
4
  Summary: pip install funboost,python全功能分布式函数调度框架,funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,funboost web manager 方便查看和管理消费函数;99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚
5
5
  Home-page: https://github.com/ydf0509/funboost
6
6
  Author: bfzs
@@ -24,33 +24,34 @@ Classifier: Programming Language :: Python :: 3.10
24
24
  Classifier: Programming Language :: Python :: 3.11
25
25
  Classifier: Programming Language :: Python :: 3.12
26
26
  Classifier: Programming Language :: Python :: 3.13
27
+ Classifier: Programming Language :: Python :: 3.14
27
28
  Classifier: Programming Language :: Python :: 3 :: Only
28
29
  Classifier: Topic :: Software Development :: Libraries
29
30
  Description-Content-Type: text/markdown
30
31
  License-File: LICENSE
31
- Requires-Dist: nb-log >=13.2
32
- Requires-Dist: nb-libs >=1.9
33
- Requires-Dist: nb-time >=2.4
34
- Requires-Dist: pymongo >=4.6.3
35
- Requires-Dist: AMQPStorm ==2.10.6
36
- Requires-Dist: rabbitpy ==2.0.1
37
- Requires-Dist: decorator ==5.1.1
38
- Requires-Dist: tomorrow3 ==1.1.0
39
- Requires-Dist: persist-queue >=0.4.2
40
- Requires-Dist: apscheduler <4.0.0,>=3.10.1
32
+ Requires-Dist: nb_log>=13.9
33
+ Requires-Dist: nb_libs>=1.9
34
+ Requires-Dist: nb_time>=2.4
35
+ Requires-Dist: pymongo>=4.6.3
36
+ Requires-Dist: AMQPStorm==2.10.6
37
+ Requires-Dist: rabbitpy==2.0.1
38
+ Requires-Dist: decorator==5.1.1
39
+ Requires-Dist: tomorrow3==1.1.0
40
+ Requires-Dist: persist-queue>=0.4.2
41
+ Requires-Dist: apscheduler<4.0.0,>=3.10.1
41
42
  Requires-Dist: pikav0
42
43
  Requires-Dist: pikav1
43
44
  Requires-Dist: redis2
44
45
  Requires-Dist: redis3
45
46
  Requires-Dist: redis5
46
47
  Requires-Dist: redis
47
- Requires-Dist: setuptools-rust
48
- Requires-Dist: fabric2 >=2.6.0
49
- Requires-Dist: nb-filelock
48
+ Requires-Dist: setuptools_rust
49
+ Requires-Dist: fabric2>=2.6.0
50
+ Requires-Dist: nb_filelock
50
51
  Requires-Dist: pysnooper
51
52
  Requires-Dist: deprecated
52
53
  Requires-Dist: cryptography
53
- Requires-Dist: auto-run-on-remote
54
+ Requires-Dist: auto_run_on_remote
54
55
  Requires-Dist: frozenlist
55
56
  Requires-Dist: fire
56
57
  Requires-Dist: pydantic
@@ -58,83 +59,69 @@ Requires-Dist: orjson
58
59
  Requires-Dist: async-timeout
59
60
  Requires-Dist: typing-extensions
60
61
  Provides-Extra: all
61
- Requires-Dist: confluent-kafka ==1.7.0 ; extra == 'all'
62
- Requires-Dist: celery ; extra == 'all'
63
- Requires-Dist: flower ; extra == 'all'
64
- Requires-Dist: nameko ==2.14.1 ; extra == 'all'
65
- Requires-Dist: sqlalchemy ==1.4.13 ; extra == 'all'
66
- Requires-Dist: sqlalchemy-utils ==0.36.1 ; extra == 'all'
67
- Requires-Dist: dramatiq ==1.14.2 ; extra == 'all'
68
- Requires-Dist: huey ==2.4.5 ; extra == 'all'
69
- Requires-Dist: rq ==1.15.0 ; extra == 'all'
70
- Requires-Dist: kombu ; extra == 'all'
71
- Requires-Dist: elasticsearch ; extra == 'all'
72
- Requires-Dist: gnsq ==1.0.1 ; extra == 'all'
73
- Requires-Dist: psutil ; extra == 'all'
74
- Requires-Dist: peewee ==3.17.3 ; extra == 'all'
75
- Requires-Dist: nats-python ; extra == 'all'
76
- Requires-Dist: aiohttp ==3.8.3 ; extra == 'all'
77
- Requires-Dist: paho-mqtt ; extra == 'all'
78
- Requires-Dist: rocketmq ; extra == 'all'
79
- Requires-Dist: zmq ; extra == 'all'
80
- Requires-Dist: pyzmq ; extra == 'all'
81
- Requires-Dist: kafka-python ==2.0.2 ; extra == 'all'
82
- Requires-Dist: eventlet ==0.33.3 ; extra == 'all'
83
- Requires-Dist: gevent ==22.10.2 ; extra == 'all'
84
- Requires-Dist: flask ; extra == 'all'
85
- Requires-Dist: flask-bootstrap ; extra == 'all'
86
- Requires-Dist: flask-wtf ; extra == 'all'
87
- Requires-Dist: wtforms ; extra == 'all'
88
- Requires-Dist: flask-login ; extra == 'all'
89
- Requires-Dist: pulsar-client ==3.1.0 ; (python_version >= "3.7") and extra == 'all'
90
- Provides-Extra: extra_brokers
91
- Requires-Dist: confluent-kafka ==1.7.0 ; extra == 'extra_brokers'
92
- Requires-Dist: celery ; extra == 'extra_brokers'
93
- Requires-Dist: flower ; extra == 'extra_brokers'
94
- Requires-Dist: nameko ==2.14.1 ; extra == 'extra_brokers'
95
- Requires-Dist: sqlalchemy ==1.4.13 ; extra == 'extra_brokers'
96
- Requires-Dist: sqlalchemy-utils ==0.36.1 ; extra == 'extra_brokers'
97
- Requires-Dist: dramatiq ==1.14.2 ; extra == 'extra_brokers'
98
- Requires-Dist: huey ==2.4.5 ; extra == 'extra_brokers'
99
- Requires-Dist: rq ==1.15.0 ; extra == 'extra_brokers'
100
- Requires-Dist: kombu ; extra == 'extra_brokers'
101
- Requires-Dist: elasticsearch ; extra == 'extra_brokers'
102
- Requires-Dist: gnsq ==1.0.1 ; extra == 'extra_brokers'
103
- Requires-Dist: psutil ; extra == 'extra_brokers'
104
- Requires-Dist: peewee ==3.17.3 ; extra == 'extra_brokers'
105
- Requires-Dist: nats-python ; extra == 'extra_brokers'
106
- Requires-Dist: aiohttp ==3.8.3 ; extra == 'extra_brokers'
107
- Requires-Dist: paho-mqtt ; extra == 'extra_brokers'
108
- Requires-Dist: rocketmq ; extra == 'extra_brokers'
109
- Requires-Dist: zmq ; extra == 'extra_brokers'
110
- Requires-Dist: pyzmq ; extra == 'extra_brokers'
111
- Requires-Dist: kafka-python ==2.0.2 ; extra == 'extra_brokers'
112
- Requires-Dist: eventlet ==0.33.3 ; extra == 'extra_brokers'
113
- Requires-Dist: gevent ==22.10.2 ; extra == 'extra_brokers'
114
- Requires-Dist: pulsar-client ==3.1.0 ; (python_version >= "3.7") and extra == 'extra_brokers'
62
+ Requires-Dist: confluent_kafka==1.7.0; extra == "all"
63
+ Requires-Dist: pulsar-client==3.1.0; python_version >= "3.7" and extra == "all"
64
+ Requires-Dist: celery; extra == "all"
65
+ Requires-Dist: flower; extra == "all"
66
+ Requires-Dist: nameko==2.14.1; extra == "all"
67
+ Requires-Dist: sqlalchemy==1.4.13; extra == "all"
68
+ Requires-Dist: sqlalchemy_utils==0.36.1; extra == "all"
69
+ Requires-Dist: dramatiq==1.14.2; extra == "all"
70
+ Requires-Dist: huey==2.4.5; extra == "all"
71
+ Requires-Dist: rq==1.15.0; extra == "all"
72
+ Requires-Dist: kombu; extra == "all"
73
+ Requires-Dist: elasticsearch; extra == "all"
74
+ Requires-Dist: gnsq==1.0.1; extra == "all"
75
+ Requires-Dist: psutil; extra == "all"
76
+ Requires-Dist: peewee==3.17.3; extra == "all"
77
+ Requires-Dist: nats-python; extra == "all"
78
+ Requires-Dist: aiohttp==3.8.3; extra == "all"
79
+ Requires-Dist: paho-mqtt; extra == "all"
80
+ Requires-Dist: rocketmq; extra == "all"
81
+ Requires-Dist: zmq; extra == "all"
82
+ Requires-Dist: pyzmq; extra == "all"
83
+ Requires-Dist: kafka-python==2.0.2; extra == "all"
84
+ Requires-Dist: eventlet==0.33.3; extra == "all"
85
+ Requires-Dist: gevent==22.10.2; extra == "all"
86
+ Requires-Dist: flask; extra == "all"
87
+ Requires-Dist: flask_bootstrap; extra == "all"
88
+ Requires-Dist: flask_wtf; extra == "all"
89
+ Requires-Dist: wtforms; extra == "all"
90
+ Requires-Dist: flask_login; extra == "all"
91
+ Provides-Extra: extra-brokers
92
+ Requires-Dist: confluent_kafka==1.7.0; extra == "extra-brokers"
93
+ Requires-Dist: pulsar-client==3.1.0; python_version >= "3.7" and extra == "extra-brokers"
94
+ Requires-Dist: celery; extra == "extra-brokers"
95
+ Requires-Dist: flower; extra == "extra-brokers"
96
+ Requires-Dist: nameko==2.14.1; extra == "extra-brokers"
97
+ Requires-Dist: sqlalchemy==1.4.13; extra == "extra-brokers"
98
+ Requires-Dist: sqlalchemy_utils==0.36.1; extra == "extra-brokers"
99
+ Requires-Dist: dramatiq==1.14.2; extra == "extra-brokers"
100
+ Requires-Dist: huey==2.4.5; extra == "extra-brokers"
101
+ Requires-Dist: rq==1.15.0; extra == "extra-brokers"
102
+ Requires-Dist: kombu; extra == "extra-brokers"
103
+ Requires-Dist: elasticsearch; extra == "extra-brokers"
104
+ Requires-Dist: gnsq==1.0.1; extra == "extra-brokers"
105
+ Requires-Dist: psutil; extra == "extra-brokers"
106
+ Requires-Dist: peewee==3.17.3; extra == "extra-brokers"
107
+ Requires-Dist: nats-python; extra == "extra-brokers"
108
+ Requires-Dist: aiohttp==3.8.3; extra == "extra-brokers"
109
+ Requires-Dist: paho-mqtt; extra == "extra-brokers"
110
+ Requires-Dist: rocketmq; extra == "extra-brokers"
111
+ Requires-Dist: zmq; extra == "extra-brokers"
112
+ Requires-Dist: pyzmq; extra == "extra-brokers"
113
+ Requires-Dist: kafka-python==2.0.2; extra == "extra-brokers"
114
+ Requires-Dist: eventlet==0.33.3; extra == "extra-brokers"
115
+ Requires-Dist: gevent==22.10.2; extra == "extra-brokers"
115
116
  Provides-Extra: flask
116
- Requires-Dist: flask ; extra == 'flask'
117
- Requires-Dist: flask-bootstrap ; extra == 'flask'
118
- Requires-Dist: flask-wtf ; extra == 'flask'
119
- Requires-Dist: wtforms ; extra == 'flask'
120
- Requires-Dist: flask-login ; extra == 'flask'
121
-
122
-
117
+ Requires-Dist: flask; extra == "flask"
118
+ Requires-Dist: flask_bootstrap; extra == "flask"
119
+ Requires-Dist: flask_wtf; extra == "flask"
120
+ Requires-Dist: wtforms; extra == "flask"
121
+ Requires-Dist: flask_login; extra == "flask"
123
122
 
124
123
  # 1.python万能分布式函数调度框架简funboost简介
125
124
 
126
- [//]: # (Stargazers:)
127
-
128
- [//]: # ()
129
- [//]: # ([![Stargazers repo roster for @ydf0509/funboost]&#40;https://reporoster.com/stars/ydf0509/funboost&#41;]&#40;https://github.com/ydf0509/funboost/stargazers&#41;)
130
-
131
- [//]: # ()
132
- [//]: # (Forkers:)
133
-
134
- [//]: # ()
135
- [//]: # ([![Forkers repo roster for @ydf0509/funboost]&#40;https://reporoster.com/forks/ydf0509/funboost&#41;]&#40;https://github.com/ydf0509/funboost/network/members&#41;)
136
-
137
-
138
125
  <pre style="color: greenyellow;background-color: #0c1119; font-size: medium;">
139
126
  pip install funboost ,python全功能分布式函数调度框架。 demo用法例子见文档1.3
140
127
 
@@ -160,9 +147,9 @@ Broker。funboost源码高扩展性的设计,造成“万物皆可为Broker”
160
147
  框架对代码没有入侵,可以加到任意已有项目而对项目python文件目录结构0要求,
161
148
  不像 celery django scrapy 这样的框架,要从一开始就开始规划好项目目录结构,如果不想用框架了,
162
149
  或者想改变使用其他框架框架,那么已经所写的代码组织形式就几乎成了废物,需要大改特改.
163
- 但是funboost完全不会这样,就算是加上或去掉@boost装饰器,对你的项目影响为0,用户照常使用,
150
+ 但是funboost完全不会这样,不管是加上还是去掉@boost装饰器,对你的项目影响为0,用户照常使用,
164
151
  所以用户可以对任意项目,任意时候,引入使用funboost或者去掉使用funboost,代码组织形式不需要发生变化.
165
- (即使不想用funboost了,也不需要亲自去掉@boost装饰器,因为函数有@boost装饰器对函数自身的直接调用运行没有任何影响,
152
+ (即使不想用funboost了,也不需要亲自去掉@boost装饰器,因为函数上面有@boost装饰器对函数自身的直接调用运行没有任何影响,
166
153
  用户照样可以直接例如 fun(x,y)是直接运行函数 , fun.push(x,y) 才是发送到消息队列)
167
154
 
168
155
  通过funboost web manager 管理系统,支持全面 查看 监控 管理 funboost的任务消费。
@@ -190,14 +177,13 @@ funboost只有一个@boost装饰器,@boost入参能自动补全,更重要的
190
177
  因为funboost非常注重代码补全提示,所以不存在上面celery的那些复杂高难度缺点。
191
178
  ```
192
179
 
193
-
194
180
  funboost的旧框架名字是function_scheduling_distributed_framework , 关系和兼容性见1.0.3介绍。
195
181
  旧框架地址: [https://github.com/ydf0509/distributed_framework](https://github.com/ydf0509/distributed_framework)
196
182
 
197
-
198
183
  ## 1.0 github地址和文档地址
199
184
 
200
185
  ### 1.0.1 [分布式函数调度框架文档地址 ](https://funboost.readthedocs.io/zh-cn/latest/index.html)
186
+
201
187
  [查看分布式函数调度框架文档 https://funboost.readthedocs.io/zh-cn/latest/index.html](https://funboost.readthedocs.io/zh-cn/latest/index.html)
202
188
 
203
189
  文档很长,大部分都是讲原理和对比各种框架。但是用户只需要学习1.3这1个例子就能掌握了。因为其他例子只是 @boost的 BoosterParams 里面的控制入参换了一下。
@@ -207,6 +193,7 @@ funboost的旧框架名字是function_scheduling_distributed_framework , 关系
207
193
  funboost 框架和一般的框架不一样,因为只有一行代码需要掌握,绝对不是要求用户先精通框架本身才能自由发挥。
208
194
 
209
195
  #### [1.python万能分布式函数调度框架简funboost简介](https://funboost.readthedocs.io/zh-cn/latest/articles/c1.html)
196
+
210
197
  #### [2. funboost对比celery框架](https://funboost.readthedocs.io/zh-cn/latest/articles/c2.html)
211
198
 
212
199
  #### [3.funboost框架详细介绍](https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html)
@@ -233,7 +220,6 @@ funboost 框架和一般的框架不一样,因为只有一行代码需要掌
233
220
 
234
221
  #### [13.启动 funboost web manager,查看消费结果和队列管理](https://funboost.readthedocs.io/zh-cn/latest/articles/c13.html)
235
222
 
236
-
237
223
  #### [funboost依赖的nb_log日志文档 https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2](https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2)
238
224
 
239
225
  ```
@@ -249,14 +235,8 @@ funboost 框架和一般的框架不一样,因为只有一行代码需要掌
249
235
  ```
250
236
 
251
237
  ### 1.0.2 [分布式函数调度框架github地址](https://github.com/ydf0509/funboost)
252
- [查看分布式函数调度框架github项目](https://github.com/ydf0509/funboost)
253
-
254
- [//]: # (### 1.0.3 [分布式函数调度框架qq群]&#40;https://qm.qq.com/cgi-bin/qm/qr?k=unA_o_L3sv5yushJzYGUTAwSzZ7GhUhq&jump_from=webapi&#41;)
255
-
256
- [//]: # (现在新建一个qq群 189603256)
257
-
258
- [//]:# ([点击加入 python万能分布式函数调度框架qq群]&#40;https://qm.qq.com/cgi-bin/qm/qr?k=unA_o_L3sv5yushJzYGUTAwSzZ7GhUhq&jump_from=webapi&#41;)
259
238
 
239
+ [查看分布式函数调度框架github项目](https://github.com/ydf0509/funboost)
260
240
 
261
241
  ### 1.0.3 funboost 框架 和 function_scheduling_distributed_framework 框架 关系说明
262
242
 
@@ -264,10 +244,7 @@ funboost 框架和一般的框架不一样,因为只有一行代码需要掌
264
244
  funboost 是 function_scheduling_distributed_framework的包名更新版本
265
245
  ```
266
246
 
267
-
268
-
269
- <span style="font-size:15px">旧框架地址:<span><a href="https://github.com/ydf0509/distributed_framework" style="font-size: 15px">function_scheduling_distributed_framework框架地址链接</a>
270
-
247
+ `<span style="font-size:15px">`旧框架地址:`<span><a href="https://github.com/ydf0509/distributed_framework" style="font-size: 15px">`function_scheduling_distributed_framework框架地址链接 `</a>`
271
248
 
272
249
  ## 1.1 安装方式
273
250
 
@@ -279,39 +256,26 @@ pip install funboost --upgrade
279
256
 
280
257
  ## 1.2 框架功能介绍
281
258
 
282
- 分布式函数调度框架,支持5种并发模式,30+种消息中间件,30种任务控制功能。<br>
259
+ 分布式函数调度框架,支持5种并发模式,30+种消息中间件,30种任务控制功能。`<br>`
283
260
  用途概念就是常规经典的 生产者 + 消息队列中间件 + 消费者 编程思想。
284
261
 
285
262
  有了这个框架,用户再也无需亲自手写操作进程、线程、协程的并发的代码了。
286
263
 
287
264
  有了这个框架,用户再也无需亲自手写操作redis rabbitmq socket kafka celery nameko了。
288
265
 
289
- [//]: # ([![sgV2xP.png]&#40;https://z3.ax1x.com/2021/01/19/sgV2xP.png&#41;]&#40;https://imgtu.com/i/sgV2xP&#41;)
290
-
291
- [//]: # ()
292
- [//]: # ([img-46.png]&#40;https://postimg.cc/hfW0VhCX&#41;)
293
-
294
266
  funboost示图:
295
- <a href="https://imgse.com/i/pkFFghj"><img src="https://s21.ax1x.com/2024/04/29/pkFFghj.png" alt="pkFFghj.png" border="0" /></a>
296
-
297
- [//]: # ([![img-46.png]&#40;https://i.postimg.cc/tC7mQxWN/img-46.png&#41;]&#40;https://postimg.cc/hfW0VhCX&#41;)
298
-
299
- [//]: # (就是最普通的生产者消费者流程图)
300
-
301
- [//]: # (![]&#40;https://i.niupic.com/images/2023/12/18/dVaP.png&#41;)
267
+ `<a href="https://imgse.com/i/pkFFghj"><img src="https://s21.ax1x.com/2024/04/29/pkFFghj.png" alt="pkFFghj.png" border="0" />``</a>`
302
268
 
303
269
  也就是这种非常普通的流程图,一样的意思
304
270
 
305
- <a href="https://imgse.com/i/pkFFcNQ"><img src="https://s21.ax1x.com/2024/04/29/pkFFcNQ.png" alt="pkFFcNQ.png" border="0" /></a>
271
+ `<a href="https://imgse.com/i/pkFFcNQ"><img src="https://s21.ax1x.com/2024/04/29/pkFFcNQ.png" alt="pkFFcNQ.png" border="0" />``</a>`
306
272
 
307
273
  ### 1.2.1 框架支持5种并发模式
308
274
 
309
- <div style=" font-size: xx-large; font-family: 黑体,serif; "> threading <span style="font-size: medium">(使用的是可变线程池,可以智能自动缩小和扩大线程数量,也可以运行async def的函数) </span> </div>
310
-
275
+ <div style=" font-size: xx-large; font-family: 黑体,serif; "> threading <span style="font-size: medium">(使用的是可变线程池,可以智能自动缩小和扩大线程数量,也可以运行async def的函数) </span> </div>
311
276
 
312
277
  <div style=" font-size: xx-large; font-family: 黑体,serif; "> gevent </div>
313
278
 
314
-
315
279
  <div style="font-size: xx-large; font-family: 黑体,serif; "> eventlet </div>
316
280
 
317
281
  <div style="font-size: xx-large; font-family: 黑体,serif; "> asyncio <span style="font-size: medium">(框架可以直接支持async 定义的携程函数作为任务,celery不支持) </span> </div>
@@ -333,6 +297,7 @@ funboost示图:
333
297
  以下两种方式,都是10线程加python内存queue方式运行f函数,有了此框架,用户无需代码手写手动操作线程 协程 asyncio 进程 来并发。
334
298
 
335
299
  1)手动开启线程池方式
300
+
336
301
  ```python
337
302
  import time
338
303
  from concurrent.futures import ThreadPoolExecutor
@@ -352,6 +317,7 @@ if __name__ == '__main__':
352
317
  ```
353
318
 
354
319
  2)funboost 使用内存队列,设置10线程并发
320
+
355
321
  ```python
356
322
  import time
357
323
  from funboost import BoosterParams, BrokerEnum
@@ -370,17 +336,15 @@ if __name__ == '__main__':
370
336
 
371
337
  ```
372
338
 
373
-
374
339
  ### 1.2.2 框架支持30种中间件或三方框架
375
340
 
376
341
  框架支持 rabbitmq redis python自带的queue.Queue sqlite sqlachemy kafka pulsar mongodb 直接socket celery nameko 等作为消息中间件。
377
342
 
378
343
  同时此框架也支持操作 kombu 库作为中间件,所以此框架能够支持的中间件类型只会比celery更多。
379
344
 
380
- 框架支持的中间件种类大全和选型见文档3.1章节的介绍:
381
-
382
- [3.1 各种中间件选择的场景和优势](https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html#id2)
345
+ 框架支持的中间件种类大全和选型见文档3.1章节的介绍:
383
346
 
347
+ [3.1 各种中间件选择的场景和优势](https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html#id2)
384
348
 
385
349
  ### 1.2.3 框架对任务支持30种控制功能。
386
350
 
@@ -402,6 +366,7 @@ python通用分布式函数调度框架。适用场景范围广泛, 框架非
402
366
  </pre>
403
367
 
404
368
  20种控制功能包括:
369
+
405
370
  <pre style="color: #A0A000">
406
371
  分布式:
407
372
  支持数十种最负盛名的消息中间件.(除了常规mq,还包括用不同形式的如 数据库 磁盘文件 redis等来模拟消息队列)
@@ -409,16 +374,16 @@ python通用分布式函数调度框架。适用场景范围广泛, 框架非
409
374
  并发:
410
375
  支持threading gevent eventlet asyncio 单线程 5种并发模式 叠加 多进程。
411
376
  多进程不是和前面四种模式平行的,是叠加的,例如可以是 多进程 + 协程,多进程 + 多线程。
412
-
377
+
413
378
  控频限流:
414
379
  例如十分精确的指定1秒钟运行30次函数或者0.02次函数(无论函数需要随机运行多久时间,都能精确控制到指定的消费频率;
415
-
380
+
416
381
  分布式控频限流:
417
382
  例如一个脚本反复启动多次或者多台机器多个容器在运行,如果要严格控制总的qps,能够支持分布式控频限流。
418
-
383
+
419
384
  任务持久化:
420
385
  消息队列中间件天然支持
421
-
386
+
422
387
  断点接续运行:
423
388
  无惧反复重启代码,造成任务丢失。消息队列的持久化 + 消费确认机制 做到不丢失一个消息
424
389
  (此框架很重视消息的万无一失,就是执行函数的机器支持在任何时候随时肆无忌惮反复粗暴拉电闸断电,或者强制硬关机,
@@ -429,64 +394,64 @@ python通用分布式函数调度框架。适用场景范围广泛, 框架非
429
394
  分布式函数调度框架的消费确认机制,保证函数运行完了才确认消费,正在运行突然强制关闭进程不会丢失一个消息,
430
395
  下次启动还会消费或者被别的机器消费。
431
396
  此框架的消息万无一失特性,不仅支持rabbbitmq因为原生支持,也支持redis,框架对redis的实现机制是因为客户端加了一层保障)。
432
-
397
+
433
398
  定时:
434
399
  可以按时间间隔、按指定时间执行一次、按指定时间执行多次,使用的是apscheduler包的方式。
435
-
400
+
436
401
  延时任务:
437
402
  例如规定任务发布后,延迟60秒执行,或者规定18点执行。这个概念和定时任务有一些不同。
438
-
403
+
439
404
  指定时间不运行:
440
405
  例如,有些任务你不想在白天运行,可以只在晚上的时间段运行
441
-
406
+
442
407
  消费确认:
443
408
  这是最为重要的一项功能之一,有了这才能肆无忌惮的任性反复重启代码也不会丢失一个任务。
444
409
  (常规的手写 redis.lpush + redis.blpop,然后并发的运行取出来的消息,随意关闭重启代码瞬间会丢失大量任务,
445
410
  那种有限的 断点接续 完全不可靠,根本不敢随意重启代码)
446
-
411
+
447
412
  立即重试指定次数:
448
413
  当函数运行出错,会立即重试指定的次数,达到最大次重试数后就确认消费了
449
-
414
+
450
415
  重新入队:
451
416
  在消费函数内部主动抛出一个特定类型的异常ExceptionForRequeue后,消息重新返回消息队列
452
-
417
+
453
418
  超时杀死:
454
419
  例如在函数运行时间超过10秒时候,将此运行中的函数kill
455
-
420
+
456
421
  计算消费次数速度:
457
422
  实时计算单个进程1分钟的消费次数,在日志中显示;当开启函数状态持久化后可在web页面查看消费次数
458
-
423
+
459
424
  预估消费时间:
460
425
  根据前1分钟的消费次数,按照队列剩余的消息数量来估算剩余的所需时间
461
-
426
+
462
427
  函数运行日志记录:
463
428
  使用自己设计开发的 控制台五彩日志(根据日志严重级别显示成五种颜色;使用了可跳转点击日志模板)
464
429
  + 多进程安全切片的文件日志 + 可选的kafka elastic日志
465
-
430
+
466
431
  任务过滤:
467
432
  例如求和的add函数,已经计算了1 + 2,再次发布1 + 2的任务到消息中间件,可以让框架跳过执行此任务。
468
433
  任务过滤的原理是使用的是函数入参判断是否是已近执行过来进行过滤。
469
-
434
+
470
435
  任务过滤有效期缓存:
471
436
  例如查询深圳明天的天气,可以设置任务过滤缓存30分钟,30分钟内查询过深圳的天气,则不再查询。
472
437
  30分钟以外无论是否查询过深圳明天的天气,则执行查询。
473
-
438
+
474
439
  任务过期丢弃:
475
440
  例如消息是15秒之前发布的,可以让框架丢弃此消息不执行,防止消息堆积,
476
441
  在消息可靠性要求不高但实时性要求高的高并发互联网接口中使用
477
-
442
+
478
443
  函数状态和结果持久化:
479
444
  可以分别选择函数状态和函数结果持久化到mongodb,使用的是短时间内的离散mongo任务自动聚合成批量
480
445
  任务后批量插入,尽可能的减少了插入次数
481
-
446
+
482
447
  消费状态实时可视化:
483
448
  在页面上按时间倒序实时刷新函数消费状态,包括是否成功 出错的异常类型和异常提示
484
449
  重试运行次数 执行函数的机器名字+进程id+python脚本名字 函数入参 函数结果 函数运行消耗时间等
485
-
450
+
486
451
  消费次数和速度生成统计表可视化:
487
452
  生成echarts统计图,主要是统计最近60秒每秒的消费次数、最近60分钟每分钟的消费次数
488
453
  最近24小时每小时的消费次数、最近10天每天的消费次数
489
-
454
+
490
455
  rpc:
491
456
  生产端(或叫发布端)获取消费结果。各个发布端对消费结果进行不同步骤的后续处理更灵活,而不是让消费端对消息的处理一干到底。
492
457
 
@@ -502,7 +467,7 @@ python通用分布式函数调度框架。适用场景范围广泛, 框架非
502
467
 
503
468
  远程杀死(取消)任务:
504
469
  支持在发布端杀死正在运行的消息,发送杀死命令时候对还未取出的消息则放弃运行消息。
505
-
470
+
506
471
  funboost支持命令行操作:
507
472
  使用fire实现的命令行,见文档第12章
508
473
 
@@ -511,15 +476,14 @@ python通用分布式函数调度框架。适用场景范围广泛, 框架非
511
476
 
512
477
  </pre>
513
478
 
514
-
515
479
  关于稳定性和性能,一句话概括就是直面百万c端用户(包括app和小程序), 已经连续超过三个季度稳定高效运行无事故,从没有出现过假死、崩溃、内存泄漏等问题。 windows和linux行为100%一致,不会像celery一样,相同代码前提下,很多功能在win上不能运行或出错。
516
480
 
517
-
518
481
  ## 1.3 框架使用例子
519
482
 
520
483
  使用之前先学习 PYTHONPATH的概念 [https://github.com/ydf0509/pythonpathdemo](https://github.com/ydf0509/pythonpathdemo)
521
484
 
522
485
  win cmd和linux 运行时候,设置 PYTHONPATH 为项目根目录,是为了自动生成或读取到项目根目录下的 funboost_config.py文件作为配置。
486
+
523
487
  ```
524
488
  以下这只是简单求和例子,实际情况换成任意函数里面写任意逻辑,框架可没有规定只能用于 求和函数 的自动调度并发。
525
489
  而是根据实际情况函数的参数个数、函数的内部逻辑功能,全部都由用户自定义,函数里面想写什么就写什么,想干什么就干什么,极端自由。
@@ -529,6 +493,8 @@ win cmd和linux 运行时候,设置 PYTHONPATH 为项目根目录,是为了
529
493
  有一点要说明的是框架的消息中间件的ip 端口 密码 等配置是在你第一次运行代码时候,在你当前项目的根目录下生成的 funboost_config.py 按需设置。
530
494
  ```
531
495
 
496
+ ### 1.3.1 funboost最简单例子
497
+
532
498
  ```python
533
499
  import time
534
500
  from funboost import boost, BrokerEnum,BoosterParams
@@ -568,14 +534,11 @@ if __name__ == "__main__":
568
534
 
569
535
  控制台运行截图:
570
536
 
571
- <a href="https://imgse.com/i/pkFkP4H"><img src="https://s21.ax1x.com/2024/04/29/pkFkP4H.png" alt="pkFkP4H.png" border="0" /></a>
572
-
573
-
574
- <a href="https://imgse.com/i/pkFkCUe"><img src="https://s21.ax1x.com/2024/04/29/pkFkCUe.png" alt="pkFkCUe.png" border="0" /></a>
575
-
537
+ `<a href="https://imgse.com/i/pkFkP4H"><img src="https://s21.ax1x.com/2024/04/29/pkFkP4H.png" alt="pkFkP4H.png" border="0" />``</a>`
576
538
 
539
+ `<a href="https://imgse.com/i/pkFkCUe"><img src="https://s21.ax1x.com/2024/04/29/pkFkCUe.png" alt="pkFkCUe.png" border="0" />``</a>`
577
540
 
578
- ## 1.3.2 funboost集中演示一个功能更多的综合例子
541
+ ### 1.3.2 funboost集中演示一个功能更多的综合例子
579
542
 
580
543
  ```python
581
544
 
@@ -596,7 +559,7 @@ class MyBoosterParams(BoosterParams): # 自定义的参数类,继承BoosterPa
596
559
  max_retry_times: int = 3
597
560
  concurrent_mode: str = ConcurrentModeEnum.THREADING
598
561
 
599
-
562
+
600
563
  @boost(MyBoosterParams(queue_name='s1_queue', qps=1,
601
564
  # do_task_filtering=True, # 可开启任务过滤,防止重复入参消费。
602
565
  is_using_rpc_mode=True, # 开启rpc模式,支持rpc获取结果
@@ -633,8 +596,8 @@ if __name__ == '__main__':
633
596
  for i in range(100):
634
597
  step1.push(i,i*2) # 向 step1函数的队列发送消息,入参和手动调用函数那样很相似。
635
598
  step1.publish ({'a':i,'b':i*2},task_id=f'task_{i}') # publish 第一个入参是字典,比push能传递更多funboost的辅助参数,类似celery的apply_async和delay的关系。一个简单,一个复杂但强大。
636
-
637
-
599
+
600
+
638
601
 
639
602
  """
640
603
  1.funboost 使用 ApsJobAdder.add_push_job来添加定时任务,不是add_job。
@@ -644,7 +607,10 @@ if __name__ == '__main__':
644
607
 
645
608
  下面是三种方式添加定时任务,这些定时方式都是知名apscheduler包的定时方式,和funboost没关系。
646
609
  """
647
- # 方式1:指定日期执行一次
610
+
611
+ # ApsJobAdder 类可以多次重复实例化,内部对每一个消费函数使用一个单独的apscheduler对象,避免扫描与当前关心的消费函数不相干的redis jobstore中的定时任务
612
+
613
+ # 方式1:指定日期执行一次
648
614
  ApsJobAdder(step2,
649
615
  job_store_kind='redis', # 使用reids作为 apscheduler的 jobstrores
650
616
  is_auto_start=True, # 添加任务,并同时顺便启动了定时器 执行了apscheduler对象.start()
@@ -675,10 +641,29 @@ if __name__ == '__main__':
675
641
  kwargs={"c": 50, "d": 60,"e":70},
676
642
  replace_existing=True,
677
643
  id='cron_job1')
678
-
644
+
679
645
  ctrl_c_recv() # 用于阻塞代码,阻止主线程退出,使主线程永久运行。 相当于 你在代码最末尾,加了个 while 1:time.sleep(10),使主线程永不结束。apscheduler background定时器守护线程需要这样保持定时器不退出。
680
646
 
647
+ ```
648
+
649
+ ### 1.3.3 funboost的 @BoosterParams(...) 和 @boost(BoosterParams(...)) 等效
650
+
651
+ 通常代码例子是:
652
+
653
+ ```python
654
+ @boost(BoosterParams(queue_name="task_queue_consume_any_msg"))
655
+ def task_fun(a: int, b: int):
656
+ print(f'a:{a},b:{b}')
657
+ return a + b
658
+ ```
659
+
660
+ 但如果你追求极致简化,也可以写成如下,不要@boost,直接@BoosterParams
681
661
 
662
+ ```python
663
+ @BoosterParams(queue_name="task_queue_consume_any_msg")
664
+ def task_fun(a: int, b: int):
665
+ print(f'a:{a},b:{b}')
666
+ return a + b
682
667
  ```
683
668
 
684
669
  ## funboost web manager 截图:
@@ -692,9 +677,10 @@ if __name__ == '__main__':
692
677
  运行中消费者 by ip: 根据ip搜索有哪些消费者
693
678
  [![pEJCRFx.png](https://s21.ax1x.com/2025/03/04/pEJCRFx.png)](https://imgse.com/i/pEJCRFx)
694
679
 
695
-
696
680
  队列操作:查看和操作队列,包括 清空清空 暂停消费 恢复消费 调整qps和并发
681
+
697
682
  <!-- [![pEJC6m9.png](https://s21.ax1x.com/2025/03/04/pEJC6m9.png)](https://imgse.com/i/pEJC6m9) -->
683
+
698
684
  [![pVSOJcq.png](https://s21.ax1x.com/2025/05/27/pVSOJcq.png)](https://imgse.com/i/pVSOJcq)
699
685
 
700
686
  队列操作,查看消费者详情:查看队列的所有消费者详情
@@ -704,10 +690,10 @@ if __name__ == '__main__':
704
690
  [![pVpr7sP.png](https://s21.ax1x.com/2025/05/29/pVpr7sP.png)](https://imgse.com/i/pVpr7sP)
705
691
 
706
692
  rpc调用:在网页上对30种消息队列发布消息并获取消息的函数执行结;根据taskid获取结果。
707
- <!-- [![pETq8hj.png](https://s21.ax1x.com/2025/04/28/pETq8hj.png)](https://imgse.com/i/pETq8hj) -->
708
- [![pE7y8oT.png](https://s21.ax1x.com/2025/04/29/pE7y8oT.png)](https://imgse.com/i/pE7y8oT)
709
693
 
694
+ <!-- [![pETq8hj.png](https://s21.ax1x.com/2025/04/28/pETq8hj.png)](https://imgse.com/i/pETq8hj) -->
710
695
 
696
+ [![pE7y8oT.png](https://s21.ax1x.com/2025/04/29/pE7y8oT.png)](https://imgse.com/i/pE7y8oT)
711
697
 
712
698
  ## 1.4 python分布式函数执行为什么重要?
713
699
 
@@ -726,7 +712,7 @@ python比其他语言更需要分布式函数调度框架来执行函数,有
726
712
  那么就不光是需要跨进程执行任务了,例如跨pvm解释器启动脚本共享任务(即使是同一个机器,把python xx.py连续启动多次)、
727
713
  跨docker容器、跨物理机共享任务。只有让python跑在更多进程的cpu核心 跑在更多的docker容器 跑在更多的物理机上,
728
714
  python才能获得与其他语言只需要一台机器就实现的执行速度。分布式函数调度框架来驱动函数执行针对这些不同的场景,
729
- 用户代码不需要做任何变化。
715
+ 用代码不需要做任何变化。
730
716
 
731
717
  所以比其他语言来说,python是更需要分布式函数调度框架来执行任务。
732
718
 
@@ -744,6 +730,7 @@ python比其他语言更需要分布式函数调度框架来执行函数,有
744
730
  ```
745
731
 
746
732
  ## 1.6 funboost支持支持celery框架整体作为funboost的broker (2023.4新增)
733
+
747
734
  ```
748
735
  见11.1章节代码例子,celery框架整体作为funboost的broker,funboost的发布和消费将只作为极简api,
749
736
  核心的消费调度和发布和定时功能,都是由celery框架来完成,funboost框架的发布和调度代码不实际起作用。
@@ -764,15 +751,23 @@ funboost通过支持celery作为broker_kind,使celer框架变成了funboost的
764
751
 
765
752
  [查看分布式函数调度框架完整文档](https://funboost.readthedocs.io/)
766
753
 
767
-
768
-
769
-
770
-
771
-
772
-
773
-
774
-
775
-
776
754
  ![](https://visitor-badge.glitch.me/badge?page_id=distributed_framework)
777
755
 
778
756
  <div> </div>
757
+
758
+ [//]: #
759
+ [//]: #
760
+ [//]: #
761
+ [//]: #
762
+ [//]: #
763
+ [//]: #
764
+ [//]: #
765
+ [//]: #
766
+ [//]: #
767
+ [//]: #
768
+ [//]: #
769
+ [//]: #
770
+ [//]: #
771
+ [//]: #
772
+ [//]: #
773
+ [//]: #