funboost 47.9__py3-none-any.whl → 48.1__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 (39) hide show
  1. funboost/__init__.py +3 -3
  2. funboost/assist/celery_helper.py +1 -1
  3. funboost/constant.py +7 -0
  4. funboost/consumers/base_consumer.py +132 -75
  5. funboost/consumers/redis_consumer_ack_able.py +1 -1
  6. funboost/core/active_cousumer_info_getter.py +60 -0
  7. funboost/core/current_task.py +37 -0
  8. funboost/core/func_params_model.py +2 -2
  9. funboost/core/function_result_status_saver.py +1 -1
  10. funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
  11. funboost/function_result_web/__pycache__/functions.cpython-39.pyc +0 -0
  12. funboost/function_result_web/app.py +104 -7
  13. funboost/function_result_web/functions.py +17 -4
  14. funboost/function_result_web/static/css/content_page_style.css +39 -0
  15. funboost/function_result_web/static/images/favicon.ico +0 -0
  16. funboost/function_result_web/static/js/bootstrap-datetimepicker.min.js +2 -0
  17. funboost/function_result_web/static/js/echarts.min.js +32478 -0
  18. funboost/function_result_web/static/js/moment-with-locales.min.js +1 -0
  19. funboost/function_result_web/static/js/select2.min.js +2 -0
  20. funboost/function_result_web/templates/about.html +67 -0
  21. funboost/function_result_web/templates/conusme_speed.html +217 -0
  22. funboost/function_result_web/templates/fun_result_table.html +433 -0
  23. funboost/function_result_web/templates/index.html +194 -423
  24. funboost/function_result_web/templates/index_backup.html +475 -0
  25. funboost/function_result_web/templates/index_/321/204/342/225/225/320/235/321/205/320/237/320/277/321/206/320/232/320/250/321/205/320/237/320/260.html +153 -0
  26. funboost/function_result_web/templates/queue_op.html +490 -0
  27. funboost/function_result_web/templates/running_consumer_by_ip.html +220 -0
  28. funboost/function_result_web/templates/running_consumer_by_queue_name.html +216 -0
  29. funboost/timing_job/__init__.py +3 -218
  30. funboost/timing_job/apscheduler_use_redis_store.py +6 -1
  31. funboost/timing_job/timing_job_base.py +213 -0
  32. funboost/timing_job/timing_push.py +136 -0
  33. funboost/utils/ctrl_c_end.py +1 -1
  34. {funboost-47.9.dist-info → funboost-48.1.dist-info}/METADATA +78 -76
  35. {funboost-47.9.dist-info → funboost-48.1.dist-info}/RECORD +39 -22
  36. {funboost-47.9.dist-info → funboost-48.1.dist-info}/WHEEL +1 -1
  37. {funboost-47.9.dist-info → funboost-48.1.dist-info}/LICENSE +0 -0
  38. {funboost-47.9.dist-info → funboost-48.1.dist-info}/entry_points.txt +0 -0
  39. {funboost-47.9.dist-info → funboost-48.1.dist-info}/top_level.txt +0 -0
@@ -5,6 +5,7 @@ from funboost.timing_job import FunboostBackgroundScheduler
5
5
  from funboost.funboost_config_deafult import BrokerConnConfig, FunboostCommonConfig
6
6
  from funboost.utils.decorators import RedisDistributedBlockLockContextManager
7
7
 
8
+
8
9
  """
9
10
  这个是使用redis作为定时任务持久化,支持跨机器好跨进程,外部远程 动态修改/添加/删除定时任务
10
11
  """
@@ -51,8 +52,12 @@ jobstores = {
51
52
 
52
53
  funboost_background_scheduler_redis_store = FunboostBackgroundSchedulerProcessJobsWithinRedisLock(timezone=FunboostCommonConfig.TIMEZONE, daemon=False, jobstores=jobstores)
53
54
 
54
- """
55
55
 
56
+
57
+
58
+
59
+
60
+ """
56
61
  跨python解释器 跨机器动态修改定时任务配置的例子在
57
62
 
58
63
  test_frame/test_apschedual/test_aps_redis_store.py
@@ -0,0 +1,213 @@
1
+ """
2
+ 集成定时任务。
3
+ """
4
+ import atexit
5
+
6
+ import time
7
+ from apscheduler.executors.pool import BasePoolExecutor
8
+
9
+ from typing import Union
10
+ import threading
11
+
12
+ from apscheduler.schedulers.background import BackgroundScheduler
13
+ # noinspection PyProtectedMember
14
+ from apscheduler.schedulers.base import STATE_STOPPED, STATE_RUNNING
15
+ from apscheduler.util import undefined
16
+ from threading import TIMEOUT_MAX
17
+ import deprecated
18
+ from funboost.utils.redis_manager import RedisMixin
19
+
20
+ from funboost.funboost_config_deafult import FunboostCommonConfig
21
+
22
+ from funboost.consumers.base_consumer import AbstractConsumer
23
+ from funboost.core.booster import BoostersManager, Booster
24
+
25
+ from funboost import BoosterParams
26
+ from funboost.concurrent_pool.custom_threadpool_executor import ThreadPoolExecutorShrinkAble
27
+
28
+
29
+ @deprecated.deprecated(reason='以后不要再使用这种方式,对于job_store为数据库时候需要序列化不好。使用内存和数据库都兼容的添加任务方式: add_push_job')
30
+ def timing_publish_deco(consuming_func_decorated_or_consumer: Union[callable, AbstractConsumer]):
31
+ def _deco(*args, **kwargs):
32
+ if getattr(consuming_func_decorated_or_consumer, 'is_decorated_as_consume_function', False) is True:
33
+ consuming_func_decorated_or_consumer.push(*args, **kwargs)
34
+ elif isinstance(consuming_func_decorated_or_consumer, AbstractConsumer):
35
+ consuming_func_decorated_or_consumer.publisher_of_same_queue.push(*args, **kwargs)
36
+ else:
37
+ raise TypeError('consuming_func_decorated_or_consumer 必须是被 boost 装饰的函数或者consumer类型')
38
+
39
+ return _deco
40
+
41
+
42
+ def push_fun_params_to_broker(queue_name: str, *args, **kwargs):
43
+ """
44
+ queue_name 队列名字
45
+ *args **kwargs 是消费函数的入参
46
+ """
47
+
48
+ BoostersManager.get_or_create_booster_by_queue_name(queue_name).push(*args, **kwargs)
49
+
50
+
51
+ class ThreadPoolExecutorForAps(BasePoolExecutor):
52
+ """
53
+ An executor that runs jobs in a concurrent.futures thread pool.
54
+
55
+ Plugin alias: ``threadpool``
56
+
57
+ :param max_workers: the maximum number of spawned threads.
58
+ :param pool_kwargs: dict of keyword arguments to pass to the underlying
59
+ ThreadPoolExecutor constructor
60
+ """
61
+
62
+ def __init__(self, max_workers=10, pool_kwargs=None):
63
+ pool = ThreadPoolExecutorShrinkAble(int(max_workers), )
64
+ super().__init__(pool)
65
+
66
+
67
+ class FunboostBackgroundScheduler(BackgroundScheduler):
68
+ """
69
+ 自定义的, 继承了官方BackgroundScheduler,
70
+ 通过重写 _main_loop ,使得动态修改增加删除定时任务配置更好。
71
+ """
72
+
73
+ _last_wait_seconds = None
74
+ _last_has_task = False
75
+
76
+ @deprecated.deprecated(reason='以后不要再使用这种方式,对于job_store为数据库时候需要序列化不好。使用内存和数据库都兼容的添加任务方式: add_push_job')
77
+ def add_timing_publish_job(self, func, trigger=None, args=None, kwargs=None, id=None, name=None,
78
+ misfire_grace_time=undefined, coalesce=undefined, max_instances=undefined,
79
+ next_run_time=undefined, jobstore='default', executor='default',
80
+ replace_existing=False, **trigger_args):
81
+ return self.add_job(timing_publish_deco(func), trigger, args, kwargs, id, name,
82
+ misfire_grace_time, coalesce, max_instances,
83
+ next_run_time, jobstore, executor,
84
+ replace_existing, **trigger_args)
85
+
86
+ def add_push_job(self, func: Booster, trigger=None, args=None, kwargs=None,
87
+ id=None, name=None,
88
+ misfire_grace_time=undefined, coalesce=undefined, max_instances=undefined,
89
+ next_run_time=undefined, jobstore='default', executor='default',
90
+ replace_existing=False, **trigger_args, ):
91
+ """
92
+ :param func: 被@boost装饰器装饰的函数
93
+ :param trigger:
94
+ :param args:
95
+ :param kwargs:
96
+ :param id:
97
+ :param name:
98
+ :param misfire_grace_time:
99
+ :param coalesce:
100
+ :param max_instances:
101
+ :param next_run_time:
102
+ :param jobstore:
103
+ :param executor:
104
+ :param replace_existing:
105
+ :param trigger_args:
106
+ :return:
107
+ """
108
+ # args = args or {}
109
+ # kwargs['queue_name'] = func.queue_name
110
+
111
+ """
112
+ 用户如果不使用funboost的 FunboostBackgroundScheduler 类型对象,而是使用原生的apscheduler类型对象,可以scheduler.add_job(push_fun_params_to_broker,args=(,),kwargs={})
113
+ push_fun_params_to_broker函数入参是消费函数队列的 queue_name 加上 原消费函数的入参
114
+ """
115
+ if args is None:
116
+ args = tuple()
117
+ args_list = list(args)
118
+ args_list.insert(0, func.queue_name)
119
+ args = tuple(args_list)
120
+ return self.add_job(push_fun_params_to_broker, trigger, args, kwargs, id, name,
121
+ misfire_grace_time, coalesce, max_instances,
122
+ next_run_time, jobstore, executor,
123
+ replace_existing, **trigger_args, )
124
+
125
+ def start(self, paused=False, block_exit=True):
126
+ # def _block_exit():
127
+ # while True:
128
+ # time.sleep(3600)
129
+ #
130
+ # threading.Thread(target=_block_exit,).start() # 既不希望用BlockingScheduler阻塞主进程也不希望定时退出。
131
+ # self._daemon = False
132
+ def _when_exit():
133
+ while 1:
134
+ # print('阻止退出')
135
+ time.sleep(100)
136
+
137
+ if block_exit:
138
+ atexit.register(_when_exit)
139
+ super().start(paused=paused, )
140
+ # _block_exit() # python3.9 判断守护线程结束必须主线程在运行。你自己在你的运行代碼的最末尾加上 while 1: time.sleep(100) ,来阻止主线程退出。
141
+
142
+ def _main_loop00000(self):
143
+ """
144
+ 原来的代码是这,动态添加任务不友好。
145
+ :return:
146
+ """
147
+ wait_seconds = threading.TIMEOUT_MAX
148
+ while self.state != STATE_STOPPED:
149
+ print(6666, self._event.is_set(), wait_seconds)
150
+ self._event.wait(wait_seconds)
151
+ print(7777, self._event.is_set(), wait_seconds)
152
+ self._event.clear()
153
+ wait_seconds = self._process_jobs()
154
+
155
+ def _main_loop(self):
156
+ """原来的_main_loop 删除所有任务后wait_seconds 会变成None,无限等待。
157
+ 或者下一个需要运行的任务的wait_seconds是3600秒后,此时新加了一个动态任务需要3600秒后,
158
+ 现在最多只需要1秒就能扫描到动态新增的定时任务了。
159
+ """
160
+ MAX_WAIT_SECONDS_FOR_NEX_PROCESS_JOBS = 0.5
161
+ wait_seconds = None
162
+ while self.state != STATE_STOPPED:
163
+ if wait_seconds is None:
164
+ wait_seconds = MAX_WAIT_SECONDS_FOR_NEX_PROCESS_JOBS
165
+ self._last_wait_seconds = min(wait_seconds, MAX_WAIT_SECONDS_FOR_NEX_PROCESS_JOBS)
166
+ if wait_seconds in (None, TIMEOUT_MAX):
167
+ self._last_has_task = False
168
+ else:
169
+ self._last_has_task = True
170
+ time.sleep(self._last_wait_seconds) # 这个要取最小值,不然例如定时间隔0.1秒运行,不取最小值,不会每隔0.1秒运行。
171
+ wait_seconds = self._process_jobs()
172
+
173
+ def _create_default_executor(self):
174
+ return ThreadPoolExecutorForAps() # 必须是apscheduler pool的子类
175
+
176
+
177
+ FsdfBackgroundScheduler = FunboostBackgroundScheduler # 兼容一下名字,fsdf是 function-scheduling-distributed-framework 老框架名字的缩写
178
+ # funboost_aps_scheduler定时配置基于内存的,不可以跨机器远程动态添加/修改/删除定时任务配置。如果需要动态增删改查定时任务,可以使用funboost_background_scheduler_redis_store
179
+
180
+ funboost_aps_scheduler = FunboostBackgroundScheduler(timezone=FunboostCommonConfig.TIMEZONE, daemon=False, )
181
+ fsdf_background_scheduler = funboost_aps_scheduler # 兼容一下老名字。
182
+
183
+ if __name__ == '__main__':
184
+ # 定时运行消费演示
185
+ import datetime
186
+ from funboost import boost, BrokerEnum, fsdf_background_scheduler, timing_publish_deco, run_forever
187
+
188
+
189
+ @Booster(boost_params=BoosterParams(queue_name='queue_test_666', broker_kind=BrokerEnum.LOCAL_PYTHON_QUEUE))
190
+ def consume_func(x, y):
191
+ print(f'{x} + {y} = {x + y}')
192
+
193
+
194
+ print(consume_func, type(consume_func))
195
+
196
+ # 定时每隔3秒执行一次。
197
+ funboost_aps_scheduler.add_push_job(consume_func,
198
+ 'interval', id='3_second_job', seconds=3, kwargs={"x": 5, "y": 6})
199
+
200
+ # 定时,只执行一次
201
+ funboost_aps_scheduler.add_push_job(consume_func,
202
+ 'date', run_date=datetime.datetime(2020, 7, 24, 13, 53, 6), args=(5, 6,))
203
+
204
+ # 定时,每天的11点32分20秒都执行一次。
205
+ funboost_aps_scheduler.add_push_job(consume_func,
206
+ 'cron', day_of_week='*', hour=18, minute=22, second=20, args=(5, 6,))
207
+
208
+ # 启动定时
209
+ funboost_aps_scheduler.start()
210
+
211
+ # 启动消费
212
+ consume_func.consume()
213
+ run_forever()
@@ -0,0 +1,136 @@
1
+ from funboost.utils import redis_manager
2
+ from funboost.core.booster import BoostersManager, Booster
3
+
4
+ from apscheduler.jobstores.redis import RedisJobStore
5
+ from funboost.timing_job.timing_job_base import funboost_aps_scheduler, undefined
6
+ from funboost.timing_job.apscheduler_use_redis_store import FunboostBackgroundSchedulerProcessJobsWithinRedisLock
7
+ from funboost.funboost_config_deafult import FunboostCommonConfig
8
+ from apscheduler.schedulers.base import BaseScheduler
9
+
10
+
11
+ class ApsJobAdder:
12
+ """
13
+ 20250116新增加的统一的新增定时任务的方式,推荐这种方式。
14
+ 用户不用像之前再去关心使用哪个apscheduler对象去添加定时任务了。
15
+
16
+ 例如 add_numbers 是@boost装饰的消费函数
17
+ ApsJobAdder(add_numbers,job_store_kind='memory').add_push_job(
18
+ args=(1, 2),
19
+ trigger='date', # 使用日期触发器
20
+ run_date='2025-01-16 18:23:50', # 设置运行时间
21
+ # id='add_numbers_job' # 任务ID
22
+ )
23
+
24
+ """
25
+
26
+ queue__redis_aps_map = {}
27
+
28
+ def __init__(self, booster: Booster, job_store_kind: str = 'memory'):
29
+ """
30
+ Initialize the ApsJobAdder.
31
+
32
+ :param booster: A Booster object representing the function to be scheduled.
33
+ :param job_store_kind: The type of job store to use. Default is 'memory'.
34
+ Can be 'memory' or 'redis'.
35
+ """
36
+ self.booster = booster
37
+ self.job_store_kind = job_store_kind
38
+
39
+ @classmethod
40
+ def get_funboost_redis_apscheduler(cls, queue_name):
41
+ """
42
+ 每个队列名字的定时任务用不同的redis jobstore的 jobs_key 和 run_times_key,防止互相干扰和取出不属于自己的任务
43
+ """
44
+ if queue_name in cls.queue__redis_aps_map:
45
+ return cls.queue__redis_aps_map[queue_name]
46
+ redis_jobstores = {
47
+
48
+ "default": RedisJobStore(**redis_manager.get_redis_conn_kwargs(),
49
+ jobs_key=f'funboost.apscheduler.{queue_name}.jobs',
50
+ run_times_key=f'funboost.apscheduler.{queue_name}.run_times',
51
+ )
52
+ }
53
+ redis_aps = FunboostBackgroundSchedulerProcessJobsWithinRedisLock(timezone=FunboostCommonConfig.TIMEZONE,
54
+ daemon=False, jobstores=redis_jobstores)
55
+ cls.queue__redis_aps_map[queue_name] = redis_aps
56
+ return redis_aps
57
+
58
+ @property
59
+ def aps_obj(self) -> BaseScheduler:
60
+ if self.job_store_kind == 'redis':
61
+ return self.get_funboost_redis_apscheduler(self.booster.queue_name)
62
+ elif self.job_store_kind == 'memory':
63
+ return funboost_aps_scheduler
64
+ else:
65
+ raise ValueError('Unsupported job_store_kind')
66
+
67
+ def add_push_job(self, trigger=None, args=None, kwargs=None,
68
+ id=None, name=None,
69
+ misfire_grace_time=undefined, coalesce=undefined, max_instances=undefined,
70
+ next_run_time=undefined, jobstore='default', executor='default',
71
+ replace_existing=False, **trigger_args, ):
72
+ """
73
+ 这里的入参都是和apscheduler的add_job的入参一样的,funboost作者没有创造新的入参。
74
+ 但是官方apscheduler的入参第一个入参是函数,
75
+ funboost的ApsJobAdder对象.add_push_job入参去掉了函数,因为类的实例化时候会把函数传进来,不需要再麻烦用户一次了。
76
+ """
77
+
78
+ if not getattr(self.aps_obj, 'has_started_flag', False):
79
+ self.aps_obj.has_started_flag = True
80
+ self.aps_obj.start(paused=False)
81
+ return self.aps_obj.add_push_job(self.booster, trigger, args, kwargs, id, name,
82
+ misfire_grace_time, coalesce, max_instances,
83
+ next_run_time, jobstore, executor,
84
+ replace_existing, **trigger_args, )
85
+
86
+
87
+ if __name__ == '__main__':
88
+ """
89
+ 2025年后定时任务现在推荐使用 ApsJobAdder 写法 ,用户不需要亲自选择使用 apscheduler对象来添加定时任务
90
+ """
91
+ from funboost import boost, BrokerEnum, ctrl_c_recv, BoosterParams, ApsJobAdder
92
+
93
+
94
+ # 定义任务处理函数
95
+ @BoosterParams(queue_name='sum_queue3', broker_kind=BrokerEnum.REDIS)
96
+ def sum_two_numbers(x, y):
97
+ result = x + y
98
+ print(f'The sum of {x} and {y} is {result}')
99
+
100
+ # 启动消费者
101
+ sum_two_numbers.consume()
102
+
103
+ # 发布任务
104
+ sum_two_numbers.push(3, 5)
105
+ sum_two_numbers.push(10, 20)
106
+
107
+
108
+
109
+ # 使用ApsJobAdder添加定时任务, 里面的定时语法,和apscheduler是一样的,用户需要自己熟悉知名框架apscheduler的add_job定时入参
110
+
111
+ # 方式1:指定日期执行一次
112
+ ApsJobAdder(sum_two_numbers, job_store_kind='redis').add_push_job(
113
+ trigger='date',
114
+ run_date='2025-01-17 23:25:40',
115
+ args=(7, 8)
116
+ )
117
+
118
+ # 方式2:固定间隔执行
119
+ ApsJobAdder(sum_two_numbers, job_store_kind='memory').add_push_job(
120
+ trigger='interval',
121
+ seconds=5,
122
+ args=(4, 6)
123
+ )
124
+
125
+ # 方式3:使用cron表达式定时执行
126
+ ApsJobAdder(sum_two_numbers, job_store_kind='redis').add_push_job(
127
+ trigger='cron',
128
+ day_of_week='*',
129
+ hour=23,
130
+ minute=49,
131
+ second=50,
132
+ kwargs={"x": 50, "y": 60},
133
+ replace_existing=True,
134
+ id='cron_job1')
135
+
136
+ ctrl_c_recv()
@@ -4,7 +4,7 @@ import time
4
4
 
5
5
 
6
6
  def ctrl_c_recv():
7
- for i in range(4):
7
+ for i in range(3):
8
8
  while 1:
9
9
  try:
10
10
  time.sleep(2)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: funboost
3
- Version: 47.9
3
+ Version: 48.1
4
4
  Summary: pip install funboost,python全功能分布式函数调度框架,funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚
5
5
  Home-page: https://github.com/ydf0509/funboost
6
6
  Author: bfzs
@@ -27,29 +27,29 @@ Classifier: Programming Language :: Python :: 3 :: Only
27
27
  Classifier: Topic :: Software Development :: Libraries
28
28
  Description-Content-Type: text/markdown
29
29
  License-File: LICENSE
30
- Requires-Dist: nb_log>=13.2
31
- Requires-Dist: nb_libs>=1.8
32
- Requires-Dist: nb_time>=2.1
33
- Requires-Dist: pymongo>=4.6.3
34
- Requires-Dist: AMQPStorm==2.10.6
35
- Requires-Dist: rabbitpy==2.0.1
36
- Requires-Dist: decorator==5.1.1
37
- Requires-Dist: tomorrow3==1.1.0
38
- Requires-Dist: persist-queue>=0.4.2
39
- Requires-Dist: apscheduler>=3.10.1
30
+ Requires-Dist: nb-log >=13.2
31
+ Requires-Dist: nb-libs >=1.8
32
+ Requires-Dist: nb-time >=2.3
33
+ Requires-Dist: pymongo >=4.6.3
34
+ Requires-Dist: AMQPStorm ==2.10.6
35
+ Requires-Dist: rabbitpy ==2.0.1
36
+ Requires-Dist: decorator ==5.1.1
37
+ Requires-Dist: tomorrow3 ==1.1.0
38
+ Requires-Dist: persist-queue >=0.4.2
39
+ Requires-Dist: apscheduler >=3.10.1
40
40
  Requires-Dist: pikav0
41
41
  Requires-Dist: pikav1
42
42
  Requires-Dist: redis2
43
43
  Requires-Dist: redis3
44
44
  Requires-Dist: redis5
45
45
  Requires-Dist: redis
46
- Requires-Dist: setuptools_rust
47
- Requires-Dist: fabric2==2.6.0
48
- Requires-Dist: nb_filelock
46
+ Requires-Dist: setuptools-rust
47
+ Requires-Dist: fabric2 >=2.6.0
48
+ Requires-Dist: nb-filelock
49
49
  Requires-Dist: pysnooper
50
50
  Requires-Dist: deprecated
51
51
  Requires-Dist: cryptography
52
- Requires-Dist: auto_run_on_remote
52
+ Requires-Dist: auto-run-on-remote
53
53
  Requires-Dist: frozenlist
54
54
  Requires-Dist: fire
55
55
  Requires-Dist: pydantic
@@ -57,66 +57,66 @@ Requires-Dist: orjson
57
57
  Requires-Dist: async-timeout
58
58
  Requires-Dist: typing-extensions
59
59
  Provides-Extra: all
60
- Requires-Dist: confluent_kafka==1.7.0; extra == "all"
61
- Requires-Dist: pulsar-client==3.1.0; python_version >= "3.7" and 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: eventlet==0.33.3; extra == "all"
72
- Requires-Dist: gevent==22.10.2; 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: 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
- Provides-Extra: extra-brokers
90
- Requires-Dist: confluent_kafka==1.7.0; extra == "extra-brokers"
91
- Requires-Dist: pulsar-client==3.1.0; python_version >= "3.7" and 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: eventlet==0.33.3; extra == "extra-brokers"
102
- Requires-Dist: gevent==22.10.2; 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"
60
+ Requires-Dist: confluent-kafka ==1.7.0 ; extra == 'all'
61
+ Requires-Dist: celery ; extra == 'all'
62
+ Requires-Dist: flower ; extra == 'all'
63
+ Requires-Dist: nameko ==2.14.1 ; extra == 'all'
64
+ Requires-Dist: sqlalchemy ==1.4.13 ; extra == 'all'
65
+ Requires-Dist: sqlalchemy-utils ==0.36.1 ; extra == 'all'
66
+ Requires-Dist: dramatiq ==1.14.2 ; extra == 'all'
67
+ Requires-Dist: huey ==2.4.5 ; extra == 'all'
68
+ Requires-Dist: rq ==1.15.0 ; extra == 'all'
69
+ Requires-Dist: kombu ; extra == 'all'
70
+ Requires-Dist: eventlet ==0.33.3 ; extra == 'all'
71
+ Requires-Dist: gevent ==22.10.2 ; 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: flask ; extra == 'all'
84
+ Requires-Dist: flask-bootstrap ; extra == 'all'
85
+ Requires-Dist: flask-wtf ; extra == 'all'
86
+ Requires-Dist: wtforms ; extra == 'all'
87
+ Requires-Dist: flask-login ; extra == 'all'
88
+ Requires-Dist: pulsar-client ==3.1.0 ; (python_version >= "3.7") and extra == 'all'
89
+ Provides-Extra: extra_brokers
90
+ Requires-Dist: confluent-kafka ==1.7.0 ; extra == 'extra_brokers'
91
+ Requires-Dist: celery ; extra == 'extra_brokers'
92
+ Requires-Dist: flower ; extra == 'extra_brokers'
93
+ Requires-Dist: nameko ==2.14.1 ; extra == 'extra_brokers'
94
+ Requires-Dist: sqlalchemy ==1.4.13 ; extra == 'extra_brokers'
95
+ Requires-Dist: sqlalchemy-utils ==0.36.1 ; extra == 'extra_brokers'
96
+ Requires-Dist: dramatiq ==1.14.2 ; extra == 'extra_brokers'
97
+ Requires-Dist: huey ==2.4.5 ; extra == 'extra_brokers'
98
+ Requires-Dist: rq ==1.15.0 ; extra == 'extra_brokers'
99
+ Requires-Dist: kombu ; extra == 'extra_brokers'
100
+ Requires-Dist: eventlet ==0.33.3 ; extra == 'extra_brokers'
101
+ Requires-Dist: gevent ==22.10.2 ; 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: pulsar-client ==3.1.0 ; (python_version >= "3.7") and extra == 'extra_brokers'
114
114
  Provides-Extra: flask
115
- Requires-Dist: flask; extra == "flask"
116
- Requires-Dist: flask_bootstrap; extra == "flask"
117
- Requires-Dist: flask_wtf; extra == "flask"
118
- Requires-Dist: wtforms; extra == "flask"
119
- Requires-Dist: flask_login; extra == "flask"
115
+ Requires-Dist: flask ; extra == 'flask'
116
+ Requires-Dist: flask-bootstrap ; extra == 'flask'
117
+ Requires-Dist: flask-wtf ; extra == 'flask'
118
+ Requires-Dist: wtforms ; extra == 'flask'
119
+ Requires-Dist: flask-login ; extra == 'flask'
120
120
 
121
121
 
122
122
 
@@ -146,7 +146,7 @@ funboost的功能是全面性重量级,用户能想得到的功能99%全都有
146
146
 
147
147
  python函数加速器,框架包罗万象,一统编程思维,兼容50% python编程业务场景,适用范围广。
148
148
  python万能分布式函数调度框架,支持5种并发模式,30+种消息队列中间件(或任务队列框架),
149
- 30种任务控制功能。给任意python函数赋能。
149
+ 30种任务控制功能。给任意python函数赋能。
150
150
  用途概念就是常规经典的 生产者 + 消息队列中间件 + 消费者 编程思想。
151
151
 
152
152
  框架只需要学习@boost这一个装饰器的入参就可以,所有用法几乎和1.3例子一摸一样,非常简化简单。
@@ -528,7 +528,9 @@ if __name__ == "__main__":
528
528
 
529
529
  <a href="https://imgse.com/i/pkFkCUe"><img src="https://s21.ax1x.com/2024/04/29/pkFkCUe.png" alt="pkFkCUe.png" border="0" /></a>
530
530
 
531
- <a href="https://imgse.com/i/pkE6IYR"><img src="https://s21.ax1x.com/2024/05/07/pkE6IYR.png" alt="pkE6IYR.png" border="0" /></a>
531
+ [![pEGDim8.png](https://s21.ax1x.com/2025/03/03/pEGDim8.png)](https://imgse.com/i/pEGDim8)
532
+ [![pEGD96P.png](https://s21.ax1x.com/2025/03/03/pEGD96P.png)](https://imgse.com/i/pEGD96P)
533
+ [![pEGDCOf.png](https://s21.ax1x.com/2025/03/03/pEGDCOf.png)](https://imgse.com/i/pEGDCOf)
532
534
 
533
535
  ## 1.4 python分布式函数执行为什么重要?
534
536