funboost 44.2__py3-none-any.whl → 44.4__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 (51) hide show
  1. funboost/__init__.py +1 -1
  2. funboost/concurrent_pool/async_helper.py +3 -1
  3. funboost/consumers/base_consumer.py +30 -23
  4. funboost/consumers/http_consumer.py +1 -1
  5. funboost/consumers/http_consumer000.py +1 -2
  6. funboost/consumers/httpsqs_consumer.py +1 -1
  7. funboost/consumers/kafka_consumer.py +1 -1
  8. funboost/consumers/kafka_consumer_manually_commit.py +2 -2
  9. funboost/consumers/kombu_consumer.py +0 -1
  10. funboost/consumers/local_python_queue_consumer.py +2 -3
  11. funboost/consumers/memory_deque_consumer.py +0 -3
  12. funboost/consumers/mongomq_consumer.py +0 -1
  13. funboost/consumers/mqtt_consumer.py +1 -1
  14. funboost/consumers/nats_consumer.py +1 -1
  15. funboost/consumers/nsq_consumer.py +1 -2
  16. funboost/consumers/peewee_conusmer.py +1 -2
  17. funboost/consumers/persist_queue_consumer.py +1 -2
  18. funboost/consumers/pulsar_consumer.py +1 -2
  19. funboost/consumers/rabbitmq_amqpstorm_consumer.py +0 -2
  20. funboost/consumers/rabbitmq_pika_consumer.py +0 -2
  21. funboost/consumers/rabbitmq_pika_consumerv0.py +0 -1
  22. funboost/consumers/rabbitmq_rabbitpy_consumer.py +1 -2
  23. funboost/consumers/redis_brpoplpush_consumer.py +1 -3
  24. funboost/consumers/redis_consumer.py +4 -8
  25. funboost/consumers/redis_consumer_ack_able.py +5 -10
  26. funboost/consumers/redis_consumer_priority.py +3 -7
  27. funboost/consumers/redis_consumer_simple.py +2 -3
  28. funboost/consumers/redis_pubsub_consumer.py +3 -3
  29. funboost/consumers/redis_stream_consumer.py +3 -3
  30. funboost/consumers/rocketmq_consumer.py +2 -2
  31. funboost/consumers/sqlachemy_consumer.py +1 -1
  32. funboost/consumers/tcp_consumer.py +2 -2
  33. funboost/consumers/txt_file_consumer.py +2 -2
  34. funboost/consumers/udp_consumer.py +2 -2
  35. funboost/consumers/zeromq_consumer.py +1 -2
  36. funboost/core/booster.py +17 -2
  37. funboost/core/cli/discovery_boosters.py +2 -2
  38. funboost/core/funboost_time.py +26 -9
  39. funboost/core/helper_funs.py +16 -2
  40. funboost/core/lazy_impoter.py +30 -37
  41. funboost/core/loggers.py +3 -3
  42. funboost/core/muliti_process_enhance.py +3 -3
  43. funboost/funboost_config_deafult.py +1 -1
  44. funboost/utils/decorators.py +14 -0
  45. funboost/utils/paramiko_util.py +1 -1
  46. {funboost-44.2.dist-info → funboost-44.4.dist-info}/METADATA +9 -3
  47. {funboost-44.2.dist-info → funboost-44.4.dist-info}/RECORD +51 -51
  48. {funboost-44.2.dist-info → funboost-44.4.dist-info}/LICENSE +0 -0
  49. {funboost-44.2.dist-info → funboost-44.4.dist-info}/WHEEL +0 -0
  50. {funboost-44.2.dist-info → funboost-44.4.dist-info}/entry_points.txt +0 -0
  51. {funboost-44.2.dist-info → funboost-44.4.dist-info}/top_level.txt +0 -0
@@ -31,9 +31,9 @@ class UDPConsumer(AbstractConsumer, ):
31
31
  while True:
32
32
  data, client_addr = server.recvfrom(self.BUFSIZE)
33
33
  # print('server收到的数据', data)
34
- self._print_message_get_from_broker(f'udp {ip_port}', data.decode())
34
+ # self._print_message_get_from_broker(f'udp {ip_port}', data.decode())
35
35
  server.sendto('has_recived'.encode(), client_addr)
36
- kw = {'body': json.loads(data)}
36
+ kw = {'body': data}
37
37
  self._submit_task(kw)
38
38
 
39
39
  def _confirm_consume(self, kw):
@@ -96,8 +96,7 @@ class ZeroMqConsumer(AbstractConsumer):
96
96
  while True:
97
97
  message = zsocket.recv()
98
98
  # self.logger.debug(f""" 从 zeromq 取出的消息是 {message}""")
99
- self._print_message_get_from_broker('zeromq', message)
100
- self._submit_task({'body': json.loads(message)})
99
+ self._submit_task({'body': message})
101
100
  zsocket.send('recv ok'.encode())
102
101
 
103
102
  def _confirm_consume(self, kw):
funboost/core/booster.py CHANGED
@@ -4,6 +4,8 @@ import os
4
4
  import types
5
5
  import typing
6
6
 
7
+ from funboost.concurrent_pool import FlexibleThreadPool
8
+ from funboost.concurrent_pool.async_helper import simple_run_in_executor
7
9
  from funboost.utils.ctrl_c_end import ctrl_c_recv
8
10
  from funboost.core.loggers import flogger, develop_logger, logger_prompt
9
11
 
@@ -15,8 +17,8 @@ from funboost.core.func_params_model import BoosterParams, FunctionResultStatusP
15
17
  from funboost.factories.consumer_factory import get_consumer
16
18
  from collections import defaultdict
17
19
 
18
- if typing.TYPE_CHECKING:
19
- from funboost.core.msg_result_getter import AsyncResult
20
+
21
+ from funboost.core.msg_result_getter import AsyncResult, AioAsyncResult
20
22
 
21
23
 
22
24
  class Booster:
@@ -123,6 +125,19 @@ class Booster:
123
125
  consumer = BoostersManager.get_or_create_booster_by_queue_name(self.queue_name).consumer
124
126
  return consumer.publisher_of_same_queue.publish(msg=msg, task_id=task_id, priority_control_config=priority_control_config)
125
127
 
128
+ async def aio_push(self, *func_args, **func_kwargs) -> AioAsyncResult:
129
+ """asyncio 生态下发布消息,因为同步push只需要消耗不到1毫秒,所以基本上大概可以直接在asyncio异步生态中直接调用同步的push方法,
130
+ 但为了更好的防止网络波动(例如发布消息到外网的消息队列耗时达到10毫秒),可以使用aio_push"""
131
+ async_result = await simple_run_in_executor(self.push, *func_args, **func_kwargs)
132
+ return AioAsyncResult(async_result.task_id, )
133
+
134
+ async def aio_publish(self, msg: typing.Union[str, dict], task_id=None,
135
+ priority_control_config: PriorityConsumingControlConfig = None) -> AioAsyncResult:
136
+ """asyncio 生态下发布消息,因为同步push只需要消耗不到1毫秒,所以基本上大概可以直接在asyncio异步生态中直接调用同步的push方法,
137
+ 但为了更好的防止网络波动(例如发布消息到外网的消息队列耗时达到10毫秒),可以使用aio_push"""
138
+ async_result = await simple_run_in_executor(self.publish,msg,task_id,priority_control_config)
139
+ return AioAsyncResult(async_result.task_id, )
140
+
126
141
  # noinspection PyMethodMayBeStatic
127
142
  def multi_process_consume(self, process_num=1):
128
143
  """超高速多进程消费"""
@@ -7,7 +7,7 @@ import importlib.util
7
7
  # import nb_log
8
8
  from funboost.core.loggers import FunboostFileLoggerMixin
9
9
  from funboost.utils.decorators import flyweight
10
- from funboost.core.lazy_impoter import lazy_impoter
10
+ from funboost.core.lazy_impoter import funboost_lazy_impoter
11
11
 
12
12
  @flyweight
13
13
  class BoosterDiscovery(FunboostFileLoggerMixin):
@@ -68,7 +68,7 @@ class BoosterDiscovery(FunboostFileLoggerMixin):
68
68
  spec = importlib.util.spec_from_file_location(module_name, file_path)
69
69
  module = importlib.util.module_from_spec(spec)
70
70
  spec.loader.exec_module(module)
71
- lazy_impoter.BoostersManager.show_all_boosters()
71
+ funboost_lazy_impoter.BoostersManager.show_all_boosters()
72
72
 
73
73
 
74
74
  if __name__ == '__main__':
@@ -13,16 +13,33 @@ class FunboostTime(NbTime):
13
13
  def get_time_zone_str(self,time_zone: typing.Union[str, datetime.tzinfo,None] = None):
14
14
  return time_zone or self.default_time_zone or FunboostCommonConfig.TIMEZONE or self.get_localzone_name()
15
15
 
16
+ @staticmethod
17
+ def _get_tow_digist(num:int)->str:
18
+ if len(str(num)) ==1:
19
+ return f'0{num}'
20
+ return str(num)
21
+
22
+ def get_str(self, formatter=None):
23
+ return self.datetime_obj.strftime(formatter or self.datetime_formatter)
24
+
25
+ def get_str_fast(self):
26
+ t_str = f'{self.datetime_obj.year}-{self._get_tow_digist(self.datetime_obj.month)}-{self._get_tow_digist(self.datetime_obj.day)} {self._get_tow_digist(self.datetime_obj.hour)}:{self._get_tow_digist(self.datetime_obj.minute)}:{self._get_tow_digist(self.datetime_obj.second)}'
27
+ return t_str
16
28
 
17
29
 
18
30
  if __name__ == '__main__':
19
- print(NbTime())
20
- for i in range(100000):
21
- # print(generate_publish_time())
22
- # print(generate_publish_time_format())
23
- # generate_publish_time()
24
- # generate_publish_time_format()
25
-
26
- datetime.datetime.now(tz=pytz.timezone(FunboostCommonConfig.TIMEZONE)).strftime(NbTime.FORMATTER_DATETIME_NO_ZONE)
27
- datetime.datetime.now(tz=pytz.timezone(FunboostCommonConfig.TIMEZONE)).timestamp()
31
+ print(FunboostTime().get_str())
32
+ tz=pytz.timezone(FunboostCommonConfig.TIMEZONE)
33
+ for i in range(1000000):
34
+ pass
35
+ # FunboostTime()#.get_str_fast()
36
+
37
+ # datetime.datetime.now().strftime(NbTime.FORMATTER_DATETIME_NO_ZONE)
38
+ tz = pytz.timezone(FunboostCommonConfig.TIMEZONE)
39
+ datetime.datetime.now(tz=tz)
40
+ # datetime.datetime.now(tz=pytz.timezone(FunboostCommonConfig.TIMEZONE))#.strftime(NbTime.FORMATTER_DATETIME_NO_ZONE)
41
+ # datetime.datetime.now(tz=pytz.timezone(FunboostCommonConfig.TIMEZONE)).timestamp()
42
+
43
+ # time.strftime(NbTime.FORMATTER_DATETIME_NO_ZONE)
44
+ # time.time()
28
45
  print(NbTime())
@@ -1,7 +1,8 @@
1
1
  import copy
2
+ import pytz
2
3
  import time
3
4
  import uuid
4
-
5
+ import datetime
5
6
  from funboost.core.funboost_time import FunboostTime
6
7
 
7
8
 
@@ -46,7 +47,7 @@ class MsgGenerater:
46
47
 
47
48
  @staticmethod
48
49
  def generate_publish_time() -> float:
49
- return round(FunboostTime().timestamp,4)
50
+ return round(time.time(),4)
50
51
 
51
52
  @staticmethod
52
53
  def generate_publish_time_format() -> str:
@@ -59,3 +60,16 @@ class MsgGenerater:
59
60
  return extra_params
60
61
 
61
62
 
63
+
64
+ if __name__ == '__main__':
65
+
66
+ from funboost import FunboostCommonConfig
67
+
68
+ print(FunboostTime())
69
+ for i in range(1000000):
70
+ # time.time()
71
+ # MsgGenerater.generate_publish_time_format()
72
+
73
+ datetime.datetime.now(tz=pytz.timezone(FunboostCommonConfig.TIMEZONE)).strftime(FunboostTime.FORMATTER_DATETIME_NO_ZONE)
74
+
75
+ print(FunboostTime())
@@ -1,6 +1,6 @@
1
1
  import abc
2
2
 
3
- from funboost.utils.decorators import cached_method_result, singleton, SingletonBaseNew, SingletonBaseCustomInit
3
+ from funboost.utils.decorators import cached_method_result, singleton, SingletonBaseNew, SingletonBaseCustomInit, singleton_no_lock
4
4
 
5
5
  """
6
6
  延迟导入
@@ -8,7 +8,7 @@ from funboost.utils.decorators import cached_method_result, singleton, Singleton
8
8
  """
9
9
 
10
10
 
11
- class LazyImpoter(SingletonBaseNew):
11
+ class FunboostLazyImpoter(SingletonBaseNew):
12
12
  """
13
13
  延迟导入,避免需要互相导入.
14
14
  """
@@ -26,7 +26,7 @@ class LazyImpoter(SingletonBaseNew):
26
26
  # return get_current_taskid
27
27
 
28
28
 
29
- lazy_impoter = LazyImpoter()
29
+ funboost_lazy_impoter = FunboostLazyImpoter()
30
30
 
31
31
 
32
32
  # noinspection SpellCheckingInspection
@@ -40,34 +40,19 @@ class GeventImporter:
40
40
  from gevent.queue import JoinableQueue
41
41
  """
42
42
 
43
- @property
44
- @cached_method_result
45
- def gevent(self):
43
+ def __init__(self):
46
44
  import gevent
47
45
  print('导入gevent')
48
- return gevent
49
-
50
- @property
51
- @cached_method_result
52
- def gevent_pool(self):
53
46
  from gevent import pool as gevent_pool
54
- return gevent_pool
55
-
56
- @property
57
- @cached_method_result
58
- def monkey(self):
59
47
  from gevent import monkey
60
- print('导入gevent')
61
- return monkey
62
-
63
- @property
64
- @cached_method_result
65
- def JoinableQueue(self):
66
48
  from gevent.queue import JoinableQueue
67
- return JoinableQueue
49
+ self.gevent = gevent
50
+ self.gevent_pool = gevent_pool
51
+ self.monkey = monkey
52
+ self.JoinableQueue = JoinableQueue
68
53
 
69
54
 
70
- @singleton
55
+ @singleton_no_lock
71
56
  class EventletImporter:
72
57
  """
73
58
  避免提前导入
@@ -83,7 +68,7 @@ class EventletImporter:
83
68
  self.Timeout = Timeout
84
69
 
85
70
 
86
- @singleton
71
+ @singleton_no_lock
87
72
  class PeeweeImporter:
88
73
  def __init__(self):
89
74
  """pip install peewee == 3.17"""
@@ -99,7 +84,7 @@ class PeeweeImporter:
99
84
  self.dict_to_model = dict_to_model
100
85
 
101
86
 
102
- @singleton
87
+ @singleton_no_lock
103
88
  class AioHttpImporter:
104
89
 
105
90
  def __init__(self):
@@ -110,7 +95,7 @@ class AioHttpImporter:
110
95
  self.Request = Request
111
96
 
112
97
 
113
- @singleton
98
+ @singleton_no_lock
114
99
  class NatsImporter:
115
100
  def __init__(self):
116
101
  """pip install nats-python """
@@ -118,7 +103,8 @@ class NatsImporter:
118
103
  self.NATSClient = NATSClient
119
104
  self.NATSMessage = NATSMessage
120
105
 
121
- @singleton
106
+
107
+ @singleton_no_lock
122
108
  class GnsqImporter:
123
109
  def __init__(self):
124
110
  """pip install gnsq==1.0.1"""
@@ -131,7 +117,8 @@ class GnsqImporter:
131
117
  self.NsqdHTTPClient = NsqdHTTPClient
132
118
  self.NSQHttpError = NSQHttpError
133
119
 
134
- @singleton
120
+
121
+ @singleton_no_lock
135
122
  class ElasticsearchImporter:
136
123
  def __init__(self):
137
124
  """pip install elasticsearch """
@@ -139,28 +126,31 @@ class ElasticsearchImporter:
139
126
  self.helpers = helpers
140
127
 
141
128
 
142
- @singleton
129
+ @singleton_no_lock
143
130
  class PsutilImporter:
144
131
  def __init__(self):
145
132
  """pip install psutil"""
146
133
  import psutil
147
134
  self.psutil = psutil
148
135
 
149
- @singleton
136
+
137
+ @singleton_no_lock
150
138
  class PahoMqttImporter:
151
139
  def __init__(self):
152
140
  """pip install paho-mqtt"""
153
141
  import paho.mqtt.client as mqtt
154
142
  self.mqtt = mqtt
155
143
 
156
- @singleton
144
+
145
+ @singleton_no_lock
157
146
  class ZmqImporter:
158
147
  def __init__(self):
159
148
  """pip install zmq pyzmq"""
160
149
  import zmq
161
150
  self.zmq = zmq
162
151
 
163
- @singleton
152
+
153
+ @singleton_no_lock
164
154
  class KafkaPythonImporter:
165
155
  def __init__(self):
166
156
  """pip install kafka-python==2.0.2"""
@@ -177,7 +167,10 @@ class KafkaPythonImporter:
177
167
 
178
168
 
179
169
  if __name__ == '__main__':
180
- for i in range(10000):
181
- # lazy_impoter.BoostersManager
182
- EventletImporter().greenpool
183
- GeventImporter().JoinableQueue
170
+ print()
171
+ for i in range(1000000):
172
+ # funboost_lazy_impoter.BoostersManager
173
+ # EventletImporter().greenpool
174
+ # GeventImporter().JoinableQueue
175
+ ZmqImporter().zmq
176
+ print()
funboost/core/loggers.py CHANGED
@@ -40,11 +40,11 @@ class FunboostMetaTypeFileLogger(type):
40
40
  cls.logger: logging.Logger = get_funboost_file_logger(name)
41
41
 
42
42
 
43
- flogger = get_funboost_file_logger('funboost', )
43
+ nb_log.LogManager('_KeepAliveTimeThread').preset_log_level(_try_get_user_funboost_common_config('KEEPALIVETIMETHREAD_LOG_LEVEL') or logging.DEBUG)
44
44
 
45
+ flogger = get_funboost_file_logger('funboost', )
45
46
  # print(_try_get_user_funboost_common_config('FUNBOOST_PROMPT_LOG_LEVEL'))
46
- logger_prompt = get_funboost_file_logger('funboost.prompt', log_level_int=_try_get_user_funboost_common_config('FUNBOOST_PROMPT_LOG_LEVEL') or logging.DEBUG) # funboost框架的提示,用户自己可以设置日志级别
47
- nb_log.LogManager('_KeepAliveTimeThread').preset_log_level(_try_get_user_funboost_common_config('KEEPALIVETIMETHREAD_LOG_LEVEL') or logging.DEBUG)
47
+ logger_prompt = get_funboost_file_logger('funboost.prompt', log_level_int=_try_get_user_funboost_common_config('FUNBOOST_PROMPT_LOG_LEVEL') or logging.DEBUG)
48
48
 
49
49
  # 开发时候的调试日志,比print方便通过级别一键屏蔽。
50
50
  develop_logger = get_logger('funboost_develop', log_level_int=logging.WARNING, log_filename='funboost_develop.log')
@@ -7,11 +7,11 @@ from concurrent.futures import ProcessPoolExecutor
7
7
  from funboost.core.booster import Booster
8
8
  from funboost.core.helper_funs import run_forever
9
9
  from funboost.core.loggers import flogger
10
- from funboost.core.lazy_impoter import lazy_impoter
10
+ from funboost.core.lazy_impoter import funboost_lazy_impoter
11
11
 
12
12
 
13
13
  def _run_consumer_in_new_process(queue_name, ):
14
- booster_current_pid = lazy_impoter.BoostersManager.get_or_create_booster_by_queue_name(queue_name)
14
+ booster_current_pid = funboost_lazy_impoter.BoostersManager.get_or_create_booster_by_queue_name(queue_name)
15
15
  # booster_current_pid = boost(**boost_params)(consuming_function)
16
16
  booster_current_pid.consume()
17
17
  # ConsumersManager.join_all_consumer_shedual_task_thread()
@@ -49,7 +49,7 @@ def run_consumer_with_multi_process(booster: Booster, process_num=1):
49
49
 
50
50
 
51
51
  def _multi_process_pub_params_list_in_new_process(queue_name, msgs: List[dict]):
52
- booster_current_pid = lazy_impoter.BoostersManager.get_or_create_booster_by_queue_name(queue_name)
52
+ booster_current_pid = funboost_lazy_impoter.BoostersManager.get_or_create_booster_by_queue_name(queue_name)
53
53
  publisher = booster_current_pid.publisher
54
54
  publisher.set_log_level(20) # 超高速发布,如果打印详细debug日志会卡死屏幕和严重降低代码速度。
55
55
  for msg in msgs:
@@ -87,7 +87,7 @@ class BrokerConnConfig(DataClassBase):
87
87
  KOMBU_URL = 'redis://127.0.0.1:6379/9' # 这个就是celery依赖包kombu使用的消息队列格式,所以funboost支持一切celery支持的消息队列种类。
88
88
  # KOMBU_URL = 'sqla+sqlite:////dssf_kombu_sqlite.sqlite' # 4个//// 代表磁盘根目录下生成一个文件。推荐绝对路径。3个///是相对路径。
89
89
 
90
- CELERY_BROKER_URL = 'redis://127.0.0.1:6379/12' # 使用celery作为中间件。funboost新增支持celery框架来运行函数
90
+ CELERY_BROKER_URL = 'redis://127.0.0.1:6379/12' # 使用celery作为中间件。funboost新增支持celery框架来运行函数,url内容就是celery的broker形式.
91
91
  CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/13' # celery结果存放,可以为None
92
92
 
93
93
  DRAMATIQ_URL = RABBITMQ_URL
@@ -164,6 +164,20 @@ def singleton(cls:ClSX) -> ClSX:
164
164
 
165
165
  return _singleton
166
166
 
167
+ def singleton_no_lock(cls:ClSX) -> ClSX:
168
+ """
169
+ 单例模式装饰器,新加入线程锁,更牢固的单例模式,主要解决多线程如100线程同时实例化情况下可能会出现三例四例的情况,实测。
170
+ """
171
+ _instance = {}
172
+
173
+
174
+ @wraps(cls)
175
+ def _singleton(*args, **kwargs):
176
+ if cls not in _instance:
177
+ _instance[cls] = cls(*args, **kwargs)
178
+ return _instance[cls]
179
+
180
+ return _singleton
167
181
 
168
182
  class SingletonMeta(type):
169
183
  _instances = {}
@@ -50,7 +50,7 @@ class ParamikoFolderUploader(LoggerMixin, LoggerLevelSetterMixin):
50
50
 
51
51
  t = paramiko.Transport((host, port))
52
52
  if pkey_file_path is not None and os.path.exists(pkey_file_path):
53
- pkey = paramiko.RSAKey.from_private_key_file(open(pkey_file_path))
53
+ pkey = paramiko.RSAKey.from_private_key_file(pkey_file_path)
54
54
  t.connect(username=user, pkey=pkey)
55
55
  else:
56
56
  t.connect(username=user, password=password)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: funboost
3
- Version: 44.2
3
+ Version: 44.4
4
4
  Summary: pip install funboost,python全功能分布式函数调度框架,。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚
5
5
  Home-page: https://github.com/ydf0509/funboost
6
6
  Author: bfzs
@@ -76,6 +76,11 @@ Requires-Dist: rocketmq ; extra == 'all'
76
76
  Requires-Dist: zmq ; extra == 'all'
77
77
  Requires-Dist: pyzmq ; extra == 'all'
78
78
  Requires-Dist: kafka-python (==2.0.2) ; extra == 'all'
79
+ Requires-Dist: flask ; extra == 'all'
80
+ Requires-Dist: flask-bootstrap ; extra == 'all'
81
+ Requires-Dist: flask-wtf ; extra == 'all'
82
+ Requires-Dist: wtforms ; extra == 'all'
83
+ Requires-Dist: flask-login ; extra == 'all'
79
84
  Requires-Dist: pulsar-client (==3.1.0) ; (python_version >= "3.7") and extra == 'all'
80
85
  Provides-Extra: extra_brokers
81
86
  Requires-Dist: confluent-kafka (==1.7.0) ; extra == 'extra_brokers'
@@ -133,7 +138,7 @@ pip install funboost ,python全功能分布式函数调度框架,。 用法例
133
138
  python函数加速器,框架包罗万象,一统编程思维,兼容50% python编程业务场景,适用范围广。
134
139
  只需要一行代码即可分布式执行python一切函数,99%用过funboost的pythoner 感受是 方便 快速 强大。
135
140
  python万能分布式函数调度框架,支持5种并发模式,30+种消息队列中间件(或任务队列框架),
136
- 20种任务控制功能。给任意python函数赋能。
141
+ 30种任务控制功能。给任意python函数赋能。
137
142
  用途概念就是常规经典的 生产者 + 消息队列中间件 + 消费者 编程思想。
138
143
  框架只需要学习@boost这一个装饰器的入参就可以,所有用法几乎和1.3例子一摸一样,非常简化简单。
139
144
  </pre>
@@ -215,7 +220,7 @@ pip install funboost --upgrade
215
220
 
216
221
  ## 1.2 框架功能介绍
217
222
 
218
- 分布式函数调度框架,支持5种并发模式,20+种消息中间件,20种任务控制功能。<br>
223
+ 分布式函数调度框架,支持5种并发模式,20+种消息中间件,30种任务控制功能。<br>
219
224
  用途概念就是常规经典的 生产者 + 消息队列中间件 + 消费者 编程思想。
220
225
 
221
226
  有了这个框架,用户再也无需亲自手写操作进程、线程、协程的并发的代码了。
@@ -505,6 +510,7 @@ if __name__ == "__main__":
505
510
 
506
511
  <a href="https://imgse.com/i/pkFkCUe"><img src="https://s21.ax1x.com/2024/04/29/pkFkCUe.png" alt="pkFkCUe.png" border="0" /></a>
507
512
 
513
+ <a href="https://imgse.com/i/pkE6IYR"><img src="https://s21.ax1x.com/2024/05/07/pkE6IYR.png" alt="pkE6IYR.png" border="0" /></a>
508
514
 
509
515
  ## 1.4 python分布式函数执行为什么重要?
510
516
 
@@ -1,8 +1,8 @@
1
- funboost/__init__.py,sha256=bkCu2I-moaLBScwB72STB_G-Kt76vJ3XynmiKZHDfYU,3834
1
+ funboost/__init__.py,sha256=5ElyfATJ1YHMtE87AY-GMr6NHoojJSfe01SuYgSNu3g,3834
2
2
  funboost/__init__old.py,sha256=07A1MLsxLtuRQQOIfDyphddOwNBrGe34enoHWAnjV14,20379
3
3
  funboost/__main__.py,sha256=-6Nogi666Y0LN8fVm3JmHGTOk8xEGWvotW_GDbSaZME,1065
4
4
  funboost/constant.py,sha256=Yxt3WJt9D8ybcrgiojOy0qjnq5mffwTnTJplerGL0Oo,7188
5
- funboost/funboost_config_deafult.py,sha256=rwfHVttpqWX5tGoO7MdiCquHSrK-z56U81df-jnavlc,6613
5
+ funboost/funboost_config_deafult.py,sha256=K-kCFGEjD107wHWFspNrIWsPNSVteP2Xww1yRbXd-Wk,6651
6
6
  funboost/set_frame_config.py,sha256=fnc9yIWTxVnqFrUQrXTGPWBzHgPNebsf-xnzYpktY9U,14339
7
7
  funboost/assist/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  funboost/assist/celery_helper.py,sha256=EOxsl-y65JPwHrmL0LTGAj1nKLbS0qyRbuXcJ0xo9wc,5721
@@ -13,7 +13,7 @@ funboost/assist/rq_helper.py,sha256=HYvQ7VqIMx7dAVZZhtqQmGReCJavEuc1BQPYvfm1EvY,
13
13
  funboost/assist/rq_windows_worker.py,sha256=jQlGmU0FWPVoKVP8cyuwTuAca9VfSd75F5Qw_hR04y0,4831
14
14
  funboost/beggar_version_implementation/beggar_redis_consumer.py,sha256=x5cH6Vc3_UooY2oPeC9MlpMewrGd9qXCx6gEWi1fGa0,3941
15
15
  funboost/concurrent_pool/__init__.py,sha256=C27xYXj7c1NGuVeG7K2LxKH7JKnGwfPfITyon6xFaoE,803
16
- funboost/concurrent_pool/async_helper.py,sha256=iyb0Jcjyx-vkUGC_saSUWqN657kcR5K7B-L_SB6cDCE,3256
16
+ funboost/concurrent_pool/async_helper.py,sha256=bK4SyTu_WpgxCvai2AaiI7EKQ-COiDbqu0WPnbaJ1jM,3421
17
17
  funboost/concurrent_pool/async_pool_executor.py,sha256=n2T4WgUitloFgHfRXTaD5Ro29WkR8qEw1ftEIub03Ug,7515
18
18
  funboost/concurrent_pool/base_pool_type.py,sha256=h3xcadufMAf49CoNe5VkUyIxlniMeNtDjadqB5IsiKA,194
19
19
  funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py,sha256=pWqpKAP0Z0cuHdSHJ5ti6EpNndnIoYkPE6IOl4BvbJw,4775
@@ -33,46 +33,46 @@ funboost/concurrent_pool/backup/async_pool_executor0223.py,sha256=RVUZiylUvpTm6U
33
33
  funboost/concurrent_pool/backup/async_pool_executor_back.py,sha256=KL6zEQaa1KkZOlAO85mCC1gwLm-YC5Ghn21IUom0UKM,9598
34
34
  funboost/concurrent_pool/backup/async_pool_executor_janus.py,sha256=OHMWJ9l3EYTpPpcrPrGGKd4K0tmQ2PN8HiX0Dta0EOo,5728
35
35
  funboost/consumers/__init__.py,sha256=ZXY_6Kut1VYNQiF5aWEgIWobsW1ht9YUP0TdRZRWFqI,126
36
- funboost/consumers/base_consumer.py,sha256=X1XmLsLjXgpdCPetC_pk87OXjXwAjgsmOqPN3K70IVs,76025
36
+ funboost/consumers/base_consumer.py,sha256=lKJQwQJfonZDrV8zcglGOHEBjcACdMnq8kQhIMxY2lw,76558
37
37
  funboost/consumers/celery_consumer.py,sha256=9gtz7nlZkmv3ErmaseT0_Q__ltSPx-fOcwi-TMPoaLA,9220
38
38
  funboost/consumers/confirm_mixin.py,sha256=eY6fNwx51Hn4bQSYRjyTRwOqfCGsikVnd2Ga_Ep31N4,6062
39
39
  funboost/consumers/dramatiq_consumer.py,sha256=ozmeAfeF0U-YNYHK4suQB0N264h5AZdfMH0O45Mh-8A,2229
40
- funboost/consumers/http_consumer.py,sha256=FWhzkTAfDn7NyDKWVDaOfxy317ekz1o5HiMmsqHPgzg,2191
41
- funboost/consumers/http_consumer000.py,sha256=NXOSiN1qpLAJfJkuF6SjFpWQ28YxMDULzWCBTNMwYe8,4463
42
- funboost/consumers/httpsqs_consumer.py,sha256=oqGpAaA29f96i9FIah2dQy7eW5tFVBY82UISG1nOFY8,1183
40
+ funboost/consumers/http_consumer.py,sha256=2MVqEzHW9qIKWvgIQS7VncGfvpmWhQ3BWWjfyHWC-as,2179
41
+ funboost/consumers/http_consumer000.py,sha256=PiiSLSQB-hHgS1vAn8DoHD2siC3zO6_kKjVW0g6AFIc,4379
42
+ funboost/consumers/httpsqs_consumer.py,sha256=kaqOcrKMLrSR27XqeiheRDmpF1KDVDghgbHcefTjqt8,1171
43
43
  funboost/consumers/huey_consumer.py,sha256=cW10ZPxdZQzUuJwdqQpJIRPTj2vCbZS0uXFJ7L8bpa4,1843
44
- funboost/consumers/kafka_consumer.py,sha256=8gJauUVpVDu_xrTg3jNevVzLqv3Ry4n0JIyn89t68tI,4336
45
- funboost/consumers/kafka_consumer_manually_commit.py,sha256=r4kkCQpoBXRvnb95BkeqECQd_a_koV3Fox2nFuO50_A,9644
46
- funboost/consumers/kombu_consumer.py,sha256=DGineDPCHYVfvSraFqOi3IKIKvsFvMGldA_Pwfr70Nk,10272
47
- funboost/consumers/local_python_queue_consumer.py,sha256=jNYohp7IW1d8BT8weHE_6R11fvMFnMOFd8HE7kW8_yg,1305
48
- funboost/consumers/memory_deque_consumer.py,sha256=hmd6DaEytYDVHfNaJp0eEBKXARshNiYiOnP55VypfLM,1276
49
- funboost/consumers/mongomq_consumer.py,sha256=eXqn3o3FFRwVAGIs-z67R8T616PMgBwgVzCtg2cTUXA,1194
50
- funboost/consumers/mqtt_consumer.py,sha256=iqDPW4eqScDpR-mIYPzwop60eG1Lxoh_SCm5PAV_6yk,2309
44
+ funboost/consumers/kafka_consumer.py,sha256=OAq6fclhDBufsWTowAikGBYjptc28SIE-EDzFEz9J-I,4324
45
+ funboost/consumers/kafka_consumer_manually_commit.py,sha256=kkHyTf4EQFEEoyiZ-pZQBR-g3M1rkFYnfKFXoeODCIE,9620
46
+ funboost/consumers/kombu_consumer.py,sha256=hj2J-1r5hBbcTNXIpU6qe1MwYPD-8gEKlDTSRV3B5Js,10208
47
+ funboost/consumers/local_python_queue_consumer.py,sha256=HyUFZXY6phF6eaL1qd5z7Kof3LZ0J6EO0zllBS-skqA,1220
48
+ funboost/consumers/memory_deque_consumer.py,sha256=tTwOkrB9GdySOQstVLnU4hnBnap6rafCeoXhmV0TI5c,1110
49
+ funboost/consumers/mongomq_consumer.py,sha256=e1Cupe-Cb2LUuJlQhER6NecrvK7FyzKKZ2HxyfOI-OY,1119
50
+ funboost/consumers/mqtt_consumer.py,sha256=iLWKxe0CjKHUYrE6YMWNJHto0tD3siUAvZl9ssNsz_s,2297
51
51
  funboost/consumers/nameko_consumer.py,sha256=Qhl2FmrIjzjXLkIdMLQdhZ8GmrhiuoEss7cwGHCFT7c,2213
52
- funboost/consumers/nats_consumer.py,sha256=Ppsu08qARfpdZPYrKLJSlEsGgcCe8kETIEkrQ1d3azM,1131
53
- funboost/consumers/nsq_consumer.py,sha256=jmocB6Lzh-cwG-ScRMZlv3BWsolheFIQJR9EQYZ8CZM,1609
54
- funboost/consumers/peewee_conusmer.py,sha256=SXqC4goDtDxG-nYJ0S8A3CfsiEK4pSIYYx0H6assMF4,1248
55
- funboost/consumers/persist_queue_consumer.py,sha256=ngAC8jvme3hRhNyf-cIWFj2pb88CTUDcWQfxFLgKSDA,1107
56
- funboost/consumers/pulsar_consumer.py,sha256=DA_UINnLjQJowcgAj7DQcyUZJOMu5ksapzxorVqxC8g,2472
57
- funboost/consumers/rabbitmq_amqpstorm_consumer.py,sha256=LmBwesd8ngpPb8kR3wNTHmqWuoMtELOCSCiINfus7rk,2318
58
- funboost/consumers/rabbitmq_pika_consumer.py,sha256=IhUH-DoKaFPhOB2QAdDZx1VruSFbh2DGg08GAQ58Rc4,5512
59
- funboost/consumers/rabbitmq_pika_consumerv0.py,sha256=6DI8vK295D_ibqps9VgzTqhTPPwiyjaMGlzcpr45LD8,4814
60
- funboost/consumers/rabbitmq_rabbitpy_consumer.py,sha256=NQllPnQkqLe7u4lNDPurGCOcNu8i-CBiIjn5sGLa0KE,1426
61
- funboost/consumers/redis_brpoplpush_consumer.py,sha256=NfxqHFnmVGCBeOsWOCSM1pfh0ULtvar-0nRlhOaEMr8,3070
62
- funboost/consumers/redis_consumer.py,sha256=pcPxqFfVeNIb4lK9dWM0duYN2uQjTt8OxignL6LCKww,2835
63
- funboost/consumers/redis_consumer_ack_able.py,sha256=ipd7pFvBXc7kKMgZWw1zxxuo3kRR8CiGVOJIhPEb31A,7509
64
- funboost/consumers/redis_consumer_priority.py,sha256=zgQuCfU7abVvZLJkwEhj-EZtlppODBfJCkITOs9ZyQk,5800
65
- funboost/consumers/redis_consumer_simple.py,sha256=0osCl1kmhZ4L_Oyfe2oAhHW2HtPp0RXIs7MfpwOCnrA,927
52
+ funboost/consumers/nats_consumer.py,sha256=yv_8SC4zdw5UXBpYooFMXHaC-mNzws5IK0woxHWr1NM,1119
53
+ funboost/consumers/nsq_consumer.py,sha256=KcP4wT656LyvuwyQXnVp0B6DwYvnZ6z_Vyzt0KjHAQc,1518
54
+ funboost/consumers/peewee_conusmer.py,sha256=VqbSu9AdKO4_wgu0XhTWRO3VeWctecbbz2X_V04_kXw,1115
55
+ funboost/consumers/persist_queue_consumer.py,sha256=PUfelfW84YiqcsbcIAveWMC50rw2DScZ3u_aiaS0Kk8,1015
56
+ funboost/consumers/pulsar_consumer.py,sha256=eorN61kCvP3yg4fNAB3ZCfqpJJxPnAN6PJY48uiYX5Y,2385
57
+ funboost/consumers/rabbitmq_amqpstorm_consumer.py,sha256=r6pQP14c9-D1Bn2hc5hHoHqHOgWJaB2itiemEhz4iIM,2214
58
+ funboost/consumers/rabbitmq_pika_consumer.py,sha256=51IkRUSR0v2v7BUlA8oInx81VGeO5OaD2pk0UXHdY78,5408
59
+ funboost/consumers/rabbitmq_pika_consumerv0.py,sha256=rIQToBTBqGdjnzMhg0vyZMY87NtK_Uw8ggiTu39JQ_w,4777
60
+ funboost/consumers/rabbitmq_rabbitpy_consumer.py,sha256=xxINY037pmgF3_lJA-zhf9qUIUx6DdqC7tsUOQL3dL4,1330
61
+ funboost/consumers/redis_brpoplpush_consumer.py,sha256=HqjgjjEibq7D-5XFpJtyaPvtfXD5zbq9cjSHx4aM1gU,2952
62
+ funboost/consumers/redis_consumer.py,sha256=63QbUfEftr29XNG7989UgLWM9Adn01A5gPiBMMGQc0w,2559
63
+ funboost/consumers/redis_consumer_ack_able.py,sha256=e83pwbxYKdXfD-suUh_5uTQwomBB2-FU0xo_iRvLKFo,7221
64
+ funboost/consumers/redis_consumer_priority.py,sha256=C-ftnlGPPoB7YV3GvwLu9POVGDn_GKlBqO6NlsZ-hdY,5566
65
+ funboost/consumers/redis_consumer_simple.py,sha256=0iGaZpTOwbmbz3PkpUjy-PmsN1PmAFweA-LACv1TyZU,806
66
66
  funboost/consumers/redis_filter.py,sha256=rKNFz8mxVo4n4o8v3MP4UqdPAtoK7msQ-1xRgzFfts0,7290
67
- funboost/consumers/redis_pubsub_consumer.py,sha256=f6woSLf-_pynuj6cW31zx9-xuEniiEySjXz9lw7znkI,1220
68
- funboost/consumers/redis_stream_consumer.py,sha256=Osw4qKQNvSZqFExpPcff5hY5xaHaTdZf5pVSV1SFQZU,6428
69
- funboost/consumers/rocketmq_consumer.py,sha256=7_yklrYvJ_Eoq3tR0PScLomKTaPA3_tpn-FbVwba6AI,1782
67
+ funboost/consumers/redis_pubsub_consumer.py,sha256=8V8EqobKpEXzpsQx_H3A-JBKLsWOsE0n16g62tUMMYY,1122
68
+ funboost/consumers/redis_stream_consumer.py,sha256=xRfrtpCHxBpPHSto1mu3URN7IivX3klFgQM8IxC5tqs,6396
69
+ funboost/consumers/rocketmq_consumer.py,sha256=23KLRz8iO9e_x7asrceRJYhwJFMruUgmKw7m3pHVkw0,1692
70
70
  funboost/consumers/rq_consumer.py,sha256=JX84k6Jiv4pBiQMmnhdJ7s7Qz4ub5TWS4T7qTF-WdlM,876
71
- funboost/consumers/sqlachemy_consumer.py,sha256=vofeoKri4ERRhQBlzOstXriDDlZAwyETKCPcHSRn5UQ,1312
72
- funboost/consumers/tcp_consumer.py,sha256=hgjcXOtHyGBDS_h_p0gbOtF__Ba6DS1Chk5P9nc6Its,2045
73
- funboost/consumers/txt_file_consumer.py,sha256=MlCv9INF6DkLgdU4NsNWynHq1Tgs10a2Hp6Bn56vlIA,1343
74
- funboost/consumers/udp_consumer.py,sha256=J-G1ZYktXZ_er_1fg3FdSPVl4V_eEIHZXlBadCNpJmE,1643
75
- funboost/consumers/zeromq_consumer.py,sha256=InC7MphVxA4esGsFYCtPE_EYqpKcFeigqR5CzQ-2LH0,4426
71
+ funboost/consumers/sqlachemy_consumer.py,sha256=PawUaNV7EZWBQVWXkGaXy1Z16hUgxU4BLDeUFR83ewM,1300
72
+ funboost/consumers/tcp_consumer.py,sha256=9uXzbkgEU-r4kH07v4ASxUSTe-JEo-EgJ1228pju4W4,2035
73
+ funboost/consumers/txt_file_consumer.py,sha256=Uelk6q8hYPudofJXMTaCmg_td7z7HAcZGdoqgRgolOs,1261
74
+ funboost/consumers/udp_consumer.py,sha256=l1ll7RL87KK-L1F_DLZccO2ghxFsZtbWUJVXAOCQUx8,1633
75
+ funboost/consumers/zeromq_consumer.py,sha256=2ZAdo01k7EVZN38Eb9CWCd2hepqLM9YHE1qVBxnCPok,4346
76
76
  funboost/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
77
  funboost/contrib/api_publish_msg.py,sha256=8khUiOjbiaTuNlOU4_FMBYYNLkwHssPw-vnlE0iixVk,2480
78
78
  funboost/contrib/django_db_deco.py,sha256=RJaRUYdVqS10gWqM4Ncs0Lngox52SUaqIIn5GK5a8Uo,865
@@ -81,24 +81,24 @@ funboost/contrib/redis_consume_latest_msg_broker.py,sha256=ESortBZ2qu_4PBCa3e3Fe
81
81
  funboost/contrib/save_result_status_to_sqldb.py,sha256=AxvD7nHs4sjr9U0kwEZzyPKrsGdU_JzEgzzhh_V1_4w,4071
82
82
  funboost/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
83
  funboost/core/active_cousumer_info_getter.py,sha256=09fEc-BTEIRfDDfHmOvKnMjLjtOyp4edLsUlAXUR_Qs,4966
84
- funboost/core/booster.py,sha256=BMSrQbpvIfhigzHjloFwHb7mlw69bvk48RJN43dDiTQ,15914
84
+ funboost/core/booster.py,sha256=dEr3uFzGg3Tik3fvCm20WREIPpWO825Crj-DzBtby1w,17224
85
85
  funboost/core/current_task.py,sha256=rAIQVLqYqtlHVRkjl17yki-mqvuMb640ssGmto4RSdA,4864
86
86
  funboost/core/exceptions.py,sha256=pLF7BkRJAfDiWp2_xGZqencmwdPiSQI1NENbImExknY,1311
87
87
  funboost/core/fabric_deploy_helper.py,sha256=foieeqlNySuU9axJzNF6TavPjIUSYBx9UO3syVKUiyY,9999
88
88
  funboost/core/funboost_config_getter.py,sha256=TDccp5pQamkoJXkwyPwGsQGDJY8ej8ZT8L8RESSAD2w,382
89
- funboost/core/funboost_time.py,sha256=h_cpGnad96hCX7eET5K13jr6LXCiSuFv04eIbsuivJQ,948
89
+ funboost/core/funboost_time.py,sha256=IbB4dFCpg3oGUe90ssAJ_x0eDPtAVfvsUr4esdoKaOk,1777
90
90
  funboost/core/func_params_model.py,sha256=UWpPujyCj5xwsu6kqjSneDmekNTWkqt0AoLlEDl2RmA,19173
91
91
  funboost/core/function_result_status_config.py,sha256=PyjqAQOiwsLt28sRtH-eYRjiI3edPFO4Nde0ILFRReE,1764
92
92
  funboost/core/function_result_status_saver.py,sha256=UdokGSwU630t70AZnT9Ecj7GpYXORBDivlc9kadoI2E,9172
93
- funboost/core/helper_funs.py,sha256=m8OJVJ_U_Wp0roHYrKIrHnihcVzTM8jactGx8m6JdfA,1972
93
+ funboost/core/helper_funs.py,sha256=1MZjedV6TGdaAjmj9q-ykgoTI_BtG9ZQm58PLOMVdDM,2362
94
94
  funboost/core/kill_remote_task.py,sha256=MZ5vWLGt6SxyN76h5Lf_id9tyVUzjR-qXNyJwXaGlZY,8129
95
- funboost/core/lazy_impoter.py,sha256=bfge5s9_4BGzrifX7p54Wc1Cm7mfI7l1OD9I3Zw4iB0,4867
96
- funboost/core/loggers.py,sha256=63GtTPocskAW5tvQSUJzGEEUZ4Gs1kznLs7Tn0H5zAQ,2418
95
+ funboost/core/lazy_impoter.py,sha256=wH7u8nm6rLGtWmF643d5ga4CrJEmAhaSsDEBEeuiD4Q,4825
96
+ funboost/core/loggers.py,sha256=uy5mFLIUvKaVdJZLi6THyxqeuOmp9XEOKrH1Yci0zUM,2354
97
97
  funboost/core/msg_result_getter.py,sha256=oZDuLDR5XQNzzvgDTsA7wroICToPwrkU9-OAaXXUQSk,8031
98
- funboost/core/muliti_process_enhance.py,sha256=64rkVa5Eel-0EY2B7lc1dQTRwX4ehARVvcxQVDa6jr0,3568
98
+ funboost/core/muliti_process_enhance.py,sha256=tI3178inc5sqPh-jQc0XaTuUD1diIZyHuukBRk1Gp6Y,3595
99
99
  funboost/core/task_id_logger.py,sha256=lR19HQcX6Pp8laURCD656xNpF_JP6nLB3zUKI69EWzE,864
100
100
  funboost/core/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
- funboost/core/cli/discovery_boosters.py,sha256=UOtmbAsRduMe8Xe6NHJ11c3w7BbsxmqfOIdcWmK_qpE,3926
101
+ funboost/core/cli/discovery_boosters.py,sha256=mbEyv0bUIGcmgkfXLI_Q1IK1QvVwKyro8XccuuMEA6o,3944
102
102
  funboost/core/cli/funboost_cli_user_templ.py,sha256=XUpKLxRKtYfebPUM8wii64kB0HW8L7j9LnRpT0xCfQI,2243
103
103
  funboost/core/cli/funboost_fire.py,sha256=OT0SNi9Zb0Tom2E0cWuArQs0obUowAA_rpCF7GdaKPs,5065
104
104
  funboost/factories/__init__.py,sha256=s7kKKjR1HU5eMjPD6r5b-SXTVMo1zBp2JjOAtkyt5Yo,178
@@ -172,7 +172,7 @@ funboost/utils/block_exit.py,sha256=BnfxNYo3lnmhk686RAEoc4u3D4RU_iEMMMgu5L8gIuI,
172
172
  funboost/utils/bulk_operation.py,sha256=B4FBxlz5f4oqlKDWqer7axn4gnDSfsYoMW2zSUCnGcQ,10101
173
173
  funboost/utils/ctrl_c_end.py,sha256=FgT9An-qsUA5gW-V-UKWqOh5shC7C_uvTFn0fS7i8GI,439
174
174
  funboost/utils/custom_pysnooper.py,sha256=7yXLKEMY_JjPRRt0Y0N-wV2CFhILlYNh40Y6uRBUaj8,5923
175
- funboost/utils/decorators.py,sha256=J8dwJr2XnXu9r93nv3u2nHGuZANImOEU22LeWLE9xOY,26081
175
+ funboost/utils/decorators.py,sha256=MaoftkcBXLqRNX8KPik7K2jK5p6Brx2QfPitNaJQCm0,26541
176
176
  funboost/utils/develop_log.py,sha256=Wsx0ongGjTit5xqgk1BztYlVEkC6d0-Y7GENXLedVqY,271
177
177
  funboost/utils/expire_lock.py,sha256=AOkd1KlvZeIwQaz8ZoKxLpGxWgqQ4mfNHcFphh04o8Q,4732
178
178
  funboost/utils/json_helper.py,sha256=HDdtLyZBGpWbUm7vmTypKXd8K-Hb-9BaxpdmRlKMYUI,1849
@@ -180,7 +180,7 @@ funboost/utils/mongo_util.py,sha256=g2AdsanKm2v9X-OaTCS6hx_0JvRw5WukXIttN3TD9sI,
180
180
  funboost/utils/monkey_color_log.py,sha256=QChhQMTB6phZ2eBaPq-9tFZF1n7pWeJgmJPIB_ugkvs,7367
181
181
  funboost/utils/monkey_patches.py,sha256=vGmtPuTwNLbS8T3gpufSC_cD8_Vnp85roZrCpJZUSE4,2890
182
182
  funboost/utils/mqtt_util.py,sha256=BfCmyYwI-B8VL9499_IuYlJDCbv6ZhwyWThMf8dANOU,3199
183
- funboost/utils/paramiko_util.py,sha256=Abtid-dnM2OxK6tByaA3nhpgRxpkWRYWvdziV8rE7cQ,5250
183
+ funboost/utils/paramiko_util.py,sha256=rHJm9Cp1YX24ew3jT5iR0qPqv-WJLd7VhRoMkHphY60,5244
184
184
  funboost/utils/rabbitmq_factory.py,sha256=ifDCn2RxSGL4MccmktJc5FYQhAcboCgHBlEo3WGpq3g,2910
185
185
  funboost/utils/redis_manager.py,sha256=iG3e9k3oedtKcGwDnjKA0hUFsk_MSlvVM2C3m3K97Y4,3657
186
186
  funboost/utils/redis_manager_old.py,sha256=c3RBXN6dM3kjVBqkCdotpZuYmFs4d9emfp5iJgC61Us,5516
@@ -265,9 +265,9 @@ funboost/utils/pysnooper_ydf/utils.py,sha256=evSmGi_Oul7vSP47AJ0DLjFwoCYCfunJZ1m
265
265
  funboost/utils/pysnooper_ydf/variables.py,sha256=QejRDESBA06KG9OH4sBT4J1M55eaU29EIHg8K_igaXo,3693
266
266
  funboost/utils/times/__init__.py,sha256=Y4bQD3SIA_E7W2YvHq2Qdi0dGM4H2DxyFNdDOuFOq1w,2417
267
267
  funboost/utils/times/version.py,sha256=11XfnZVVzOgIhXXdeN_mYfdXThfrsbQHpA0wCjz-hpg,17
268
- funboost-44.2.dist-info/LICENSE,sha256=9EPP2ktG_lAPB8PjmWV-c9BiaJHc_FP6pPLcUrUwx0E,11562
269
- funboost-44.2.dist-info/METADATA,sha256=wH1HetVBjgbVv8EaDqYaGw8_jrxG46Kh9Z-ESr54eKc,31351
270
- funboost-44.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
271
- funboost-44.2.dist-info/entry_points.txt,sha256=BQMqRALuw-QT9x2d7puWaUHriXfy3wIzvfzF61AnSSI,97
272
- funboost-44.2.dist-info/top_level.txt,sha256=K8WuKnS6MRcEWxP1NvbmCeujJq6TEfbsB150YROlRw0,9
273
- funboost-44.2.dist-info/RECORD,,
268
+ funboost-44.4.dist-info/LICENSE,sha256=9EPP2ktG_lAPB8PjmWV-c9BiaJHc_FP6pPLcUrUwx0E,11562
269
+ funboost-44.4.dist-info/METADATA,sha256=YDADellqruEZqdFJLMy2TQMJLXQ-MO_LfjbtGBONgf0,31692
270
+ funboost-44.4.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
271
+ funboost-44.4.dist-info/entry_points.txt,sha256=BQMqRALuw-QT9x2d7puWaUHriXfy3wIzvfzF61AnSSI,97
272
+ funboost-44.4.dist-info/top_level.txt,sha256=K8WuKnS6MRcEWxP1NvbmCeujJq6TEfbsB150YROlRw0,9
273
+ funboost-44.4.dist-info/RECORD,,