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