funboost 42.9__py3-none-any.whl → 43.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.
- funboost/__init__.py +1 -1
- funboost/constant.py +1 -0
- funboost/consumers/base_consumer.py +21 -14
- funboost/core/cli/discovery_boosters.py +5 -4
- funboost/core/current_task.py +56 -15
- funboost/core/func_params_model.py +6 -4
- funboost/core/lazy_impoter.py +26 -0
- funboost/core/muliti_process_enhance.py +3 -5
- funboost/core/task_id_logger.py +19 -0
- funboost/funboost_config_deafult.py +6 -1
- funboost/publishers/base_publisher.py +11 -10
- funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc +0 -0
- funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py +12 -2
- funboost/utils/mongo_util.py +8 -3
- funboost/utils/time_util.py +8 -3
- {funboost-42.9.dist-info → funboost-43.1.dist-info}/METADATA +2 -2
- {funboost-42.9.dist-info → funboost-43.1.dist-info}/RECORD +21 -19
- {funboost-42.9.dist-info → funboost-43.1.dist-info}/LICENSE +0 -0
- {funboost-42.9.dist-info → funboost-43.1.dist-info}/WHEEL +0 -0
- {funboost-42.9.dist-info → funboost-43.1.dist-info}/entry_points.txt +0 -0
- {funboost-42.9.dist-info → funboost-43.1.dist-info}/top_level.txt +0 -0
funboost/__init__.py
CHANGED
funboost/constant.py
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
框架做主要的功能都是在这个文件里面实现的.
|
|
9
9
|
"""
|
|
10
|
+
import functools
|
|
10
11
|
import typing
|
|
11
12
|
import abc
|
|
12
13
|
import copy
|
|
@@ -29,10 +30,11 @@ from threading import Lock
|
|
|
29
30
|
import asyncio
|
|
30
31
|
|
|
31
32
|
import nb_log
|
|
32
|
-
from funboost.core.current_task import funboost_current_task
|
|
33
|
+
from funboost.core.current_task import funboost_current_task, get_current_taskid
|
|
33
34
|
from funboost.core.loggers import develop_logger
|
|
34
35
|
|
|
35
36
|
from funboost.core.func_params_model import BoosterParams, PublisherParams
|
|
37
|
+
from funboost.core.task_id_logger import TaskIdLogger
|
|
36
38
|
from nb_log import (get_logger, LoggerLevelSetterMixin, LogManager, CompatibleLogger,
|
|
37
39
|
LoggerMixinDefaultWithFileHandler, stdout_write, is_main_process,
|
|
38
40
|
nb_log_config_default)
|
|
@@ -67,6 +69,8 @@ from funboost.utils import decorators, time_util, redis_manager
|
|
|
67
69
|
from funboost.constant import ConcurrentModeEnum, BrokerEnum
|
|
68
70
|
from funboost.core import kill_remote_task
|
|
69
71
|
from funboost.core.exceptions import ExceptionForRequeue, ExceptionForPushToDlxqueue
|
|
72
|
+
# from funboost.core.booster import BoostersManager 互相导入
|
|
73
|
+
from funboost.core.lazy_impoter import LazyImpoter
|
|
70
74
|
|
|
71
75
|
|
|
72
76
|
# patch_apscheduler_run_job()
|
|
@@ -76,9 +80,6 @@ class GlobalVars:
|
|
|
76
80
|
has_start_a_consumer_flag = False
|
|
77
81
|
|
|
78
82
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
83
|
# noinspection DuplicatedCode
|
|
83
84
|
class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
84
85
|
time_interval_for_check_do_not_run_time = 60
|
|
@@ -218,6 +219,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
218
219
|
logger_prefix=consumer_params.logger_prefix,
|
|
219
220
|
create_logger_file=consumer_params.create_logger_file,
|
|
220
221
|
log_filename=consumer_params.log_filename,
|
|
222
|
+
logger_name=consumer_params.logger_name,
|
|
221
223
|
broker_exclusive_config=self.consumer_params.broker_exclusive_config)
|
|
222
224
|
if is_main_process:
|
|
223
225
|
self.logger.info(f'{self.queue_name} consumer 的消费者配置:\n {self.consumer_params.json_str_value()}')
|
|
@@ -228,13 +230,14 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
228
230
|
if logger_prefix != '':
|
|
229
231
|
logger_prefix += '--'
|
|
230
232
|
# logger_name = f'{logger_prefix}{self.__class__.__name__}--{concurrent_name}--{queue_name}--{self.consuming_function.__name__}'
|
|
231
|
-
logger_name = f'funboost.{logger_prefix}{self.__class__.__name__}--{self.queue_name}'
|
|
233
|
+
logger_name = self.consumer_params.logger_name or f'funboost.{logger_prefix}{self.__class__.__name__}--{self.queue_name}'
|
|
234
|
+
self.logger_name = logger_name
|
|
232
235
|
log_filename = self.consumer_params.log_filename or f'funboost.{self.queue_name}.log'
|
|
233
|
-
self.logger =
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
236
|
+
self.logger = LogManager(logger_name, logger_cls=TaskIdLogger).get_logger_and_add_handlers(
|
|
237
|
+
log_level_int=self.consumer_params.log_level,
|
|
238
|
+
log_filename=log_filename if self.consumer_params.create_logger_file else None,
|
|
239
|
+
error_log_filename=nb_log.generate_error_file_name(log_filename),
|
|
240
|
+
formatter_template=FunboostCommonConfig.NB_LOG_FORMATER_INDEX_FOR_CONSUMER_AND_PUBLISHER, )
|
|
238
241
|
self.logger.info(f'队列 {self.queue_name} 的日志写入到 {nb_log_config_default.LOG_PATH} 文件夹的 {log_filename} 和 {nb_log.generate_error_file_name(log_filename)} 文件中')
|
|
239
242
|
|
|
240
243
|
def _check_broker_exclusive_config(self):
|
|
@@ -362,8 +365,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
362
365
|
key = 'apscheduler.redisjobstore_runonce'
|
|
363
366
|
if RedisMixin().redis_db_frame.sadd(key, runonce_uuid): # 这样可以阻止多次启动同队列名消费者 redis jobstore多次运行函数.
|
|
364
367
|
cls.logger_apscheduler.debug(f'延时任务用普通消息重新发布到普通队列 {msg}')
|
|
365
|
-
|
|
366
|
-
BoostersManager.get_or_create_booster_by_queue_name(queue_name).publish(msg)
|
|
368
|
+
LazyImpoter().BoostersManager.get_or_create_booster_by_queue_name(queue_name).publish(msg)
|
|
367
369
|
|
|
368
370
|
@abc.abstractmethod
|
|
369
371
|
def _shedual_task(self):
|
|
@@ -603,9 +605,10 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
603
605
|
t_start = time.time()
|
|
604
606
|
# function_result_status.run_times = current_retry_times + 1
|
|
605
607
|
fct = funboost_current_task()
|
|
606
|
-
fct.function_params=function_only_params
|
|
607
|
-
fct.full_msg=kw['body']
|
|
608
|
+
fct.function_params = function_only_params
|
|
609
|
+
fct.full_msg = kw['body']
|
|
608
610
|
fct.function_result_status = function_result_status
|
|
611
|
+
fct.logger = self.logger
|
|
609
612
|
try:
|
|
610
613
|
function_run = self.consuming_function
|
|
611
614
|
if self._consuming_function_is_asyncio:
|
|
@@ -633,6 +636,9 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
633
636
|
function_result_status.success = True
|
|
634
637
|
if self.consumer_params.log_level <= logging.DEBUG:
|
|
635
638
|
result_str_to_be_print = str(function_result_status.result)[:100] if len(str(function_result_status.result)) < 100 else str(function_result_status.result)[:100] + ' 。。。。。 '
|
|
639
|
+
# print(funboost_current_task().task_id)
|
|
640
|
+
# print(fct.function_result_status.task_id)
|
|
641
|
+
# print(get_current_taskid())
|
|
636
642
|
self.logger.debug(f' 函数 {self.consuming_function.__name__} '
|
|
637
643
|
f'第{current_retry_times + 1}次 运行, 正确了,函数运行时间是 {round(time.time() - t_start, 4)} 秒,入参是 {function_only_params} , '
|
|
638
644
|
f'结果是 {result_str_to_be_print} {self._get_concurrent_info()} ')
|
|
@@ -768,6 +774,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
768
774
|
fct.function_params = function_only_params
|
|
769
775
|
fct.full_msg = kw['body']
|
|
770
776
|
fct.function_result_status = function_result_status
|
|
777
|
+
fct.logger = self.logger
|
|
771
778
|
try:
|
|
772
779
|
corotinue_obj = self.consuming_function(**function_only_params)
|
|
773
780
|
if not asyncio.iscoroutine(corotinue_obj):
|
|
@@ -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
|
-
|
|
10
|
+
from funboost.core.lazy_impoter import lazy_impoter
|
|
11
11
|
|
|
12
12
|
@flyweight
|
|
13
13
|
class BoosterDiscovery(FunboostFileLoggerMixin):
|
|
@@ -63,11 +63,12 @@ class BoosterDiscovery(FunboostFileLoggerMixin):
|
|
|
63
63
|
if Path(file_path) == Path(sys._getframe(1).f_code.co_filename):
|
|
64
64
|
self.logger.warning(f'排除导入调用auto_discovery的模块自身 {file_path}') # 否则下面的import这个文件,会造成无限懵逼死循环
|
|
65
65
|
continue
|
|
66
|
-
|
|
66
|
+
|
|
67
|
+
module_name = Path(file_path).as_posix().replace('/', '.') + '.' + Path(file_path).stem
|
|
68
|
+
spec = importlib.util.spec_from_file_location(module_name, file_path)
|
|
67
69
|
module = importlib.util.module_from_spec(spec)
|
|
68
70
|
spec.loader.exec_module(module)
|
|
69
|
-
|
|
70
|
-
BoostersManager.show_all_boosters()
|
|
71
|
+
lazy_impoter.BoostersManager.show_all_boosters()
|
|
71
72
|
|
|
72
73
|
|
|
73
74
|
if __name__ == '__main__':
|
funboost/core/current_task.py
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
import contextvars
|
|
2
|
+
import logging
|
|
2
3
|
import threading
|
|
3
4
|
import asyncio
|
|
4
5
|
from funboost.core.function_result_status_saver import FunctionResultStatus
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
class ThreadCurrentTask:
|
|
8
|
-
"""
|
|
9
|
-
用于在用户自己函数内部去获取 消息的完整体,当前重试次数等.
|
|
10
|
-
"""
|
|
11
|
-
""" 用法例子
|
|
7
|
+
""" 用法例子
|
|
12
8
|
'''
|
|
13
9
|
fct = funboost_current_task()
|
|
14
10
|
print(fct.function_result_status.get_status_dict())
|
|
@@ -49,33 +45,54 @@ if __name__ == '__main__':
|
|
|
49
45
|
f.consume()
|
|
50
46
|
|
|
51
47
|
"""
|
|
52
|
-
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class __ThreadCurrentTask:
|
|
51
|
+
"""
|
|
52
|
+
用于在用户自己函数内部去获取 消息的完整体,当前重试次数等.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
_fct_local_data = threading.local()
|
|
57
|
+
|
|
53
58
|
|
|
54
59
|
@property
|
|
55
60
|
def function_params(self):
|
|
56
|
-
return self.
|
|
61
|
+
return self._fct_local_data.function_params
|
|
57
62
|
|
|
58
63
|
@function_params.setter
|
|
59
64
|
def function_params(self, function_params: dict):
|
|
60
|
-
self.
|
|
65
|
+
self._fct_local_data.function_params = function_params
|
|
61
66
|
|
|
62
67
|
@property
|
|
63
68
|
def full_msg(self) -> dict:
|
|
64
|
-
return self.
|
|
69
|
+
return self._fct_local_data.full_msg
|
|
65
70
|
|
|
66
71
|
@full_msg.setter
|
|
67
72
|
def full_msg(self, full_msg: dict):
|
|
68
|
-
self.
|
|
73
|
+
self._fct_local_data.full_msg = full_msg
|
|
69
74
|
|
|
70
75
|
@property
|
|
71
76
|
def function_result_status(self) -> FunctionResultStatus:
|
|
72
|
-
return self.
|
|
77
|
+
return self._fct_local_data.function_result_status
|
|
73
78
|
|
|
74
79
|
@function_result_status.setter
|
|
75
80
|
def function_result_status(self, function_result_status: FunctionResultStatus):
|
|
76
|
-
self.
|
|
81
|
+
self._fct_local_data.function_result_status = function_result_status
|
|
77
82
|
|
|
83
|
+
@property
|
|
84
|
+
def task_id(self) -> FunctionResultStatus:
|
|
85
|
+
return self.function_result_status.task_id
|
|
86
|
+
|
|
87
|
+
@property
|
|
88
|
+
def logger(self) -> logging.Logger:
|
|
89
|
+
return self._fct_local_data.logger
|
|
78
90
|
|
|
91
|
+
@logger.setter
|
|
92
|
+
def logger(self, logger: logging.Logger):
|
|
93
|
+
self._fct_local_data.logger = logger
|
|
94
|
+
|
|
95
|
+
thread_current_task = __ThreadCurrentTask()
|
|
79
96
|
def is_asyncio_environment():
|
|
80
97
|
try:
|
|
81
98
|
loop = asyncio.get_running_loop()
|
|
@@ -84,10 +101,11 @@ def is_asyncio_environment():
|
|
|
84
101
|
return False
|
|
85
102
|
|
|
86
103
|
|
|
87
|
-
class
|
|
104
|
+
class __AsyncioCurrentTask:
|
|
88
105
|
_function_params = contextvars.ContextVar("function_params")
|
|
89
106
|
_full_msg = contextvars.ContextVar("full_msg")
|
|
90
107
|
_function_result_status = contextvars.ContextVar("function_result_status")
|
|
108
|
+
_logger = contextvars.ContextVar('logger')
|
|
91
109
|
|
|
92
110
|
@property
|
|
93
111
|
def function_params(self):
|
|
@@ -113,14 +131,37 @@ class AsyncioCurrentTask:
|
|
|
113
131
|
def function_result_status(self, function_result_status: FunctionResultStatus):
|
|
114
132
|
self._function_result_status.set(function_result_status)
|
|
115
133
|
|
|
134
|
+
@property
|
|
135
|
+
def task_id(self) :
|
|
136
|
+
return self.function_result_status.task_id
|
|
137
|
+
|
|
138
|
+
@property
|
|
139
|
+
def logger(self) -> logging.Logger:
|
|
140
|
+
return self._logger.get()
|
|
141
|
+
|
|
142
|
+
@logger.setter
|
|
143
|
+
def logger(self, logger: logging.Logger):
|
|
144
|
+
self._logger.set(logger)
|
|
145
|
+
|
|
146
|
+
asyncio_current_task = __AsyncioCurrentTask()
|
|
116
147
|
|
|
117
148
|
def funboost_current_task():
|
|
118
|
-
return
|
|
149
|
+
return asyncio_current_task if is_asyncio_environment() else thread_current_task
|
|
119
150
|
|
|
120
151
|
|
|
152
|
+
def get_current_taskid():
|
|
153
|
+
fct = funboost_current_task()
|
|
154
|
+
# return fct.function_result_status.task_id
|
|
155
|
+
try:
|
|
156
|
+
return fct.task_id # 不在funboost的消费函数里面就获取不到上下文了
|
|
157
|
+
except (AttributeError,LookupError) as e:
|
|
158
|
+
# print(e,type(e))
|
|
159
|
+
return 'no_task_id'
|
|
160
|
+
|
|
121
161
|
if __name__ == '__main__':
|
|
122
162
|
print(is_asyncio_environment())
|
|
123
163
|
print()
|
|
124
164
|
for i in range(100000):
|
|
125
165
|
funboost_current_task()
|
|
166
|
+
get_current_taskid()
|
|
126
167
|
print()
|
|
@@ -138,11 +138,12 @@ class BoosterParams(BaseJsonAbleModel):
|
|
|
138
138
|
is_push_to_dlx_queue_when_retry_max_times: bool = False # 函数达到最大重试次数仍然没成功,是否发送到死信队列,死信队列的名字是 队列名字 + _dlx。
|
|
139
139
|
|
|
140
140
|
consumin_function_decorator: typing.Callable = None # 函数的装饰器。因为此框架做参数自动转指点,需要获取精准的入参名称,不支持在消费函数上叠加 @ *args **kwargs的装饰器,如果想用装饰器可以这里指定。
|
|
141
|
-
function_timeout: typing.Union[int, float] = 0 # 超时秒数,函数运行超过这个时间,则自动杀死函数。为0是不限制。
|
|
141
|
+
function_timeout: typing.Union[int, float] = 0 # 超时秒数,函数运行超过这个时间,则自动杀死函数。为0是不限制。 谨慎使用,非必要别去设置超时时间,设置后性能会降低(因为需要把用户函数包装到另一个线单独的程中去运行),而且突然强制超时杀死运行中函数,可能会造成死锁.(例如用户函数在获得线程锁后突然杀死函数,别的线程再也无法获得锁了)
|
|
142
142
|
|
|
143
143
|
log_level: int = logging.DEBUG # 消费者和发布者的日志级别,建议设置DEBUG级别,不然无法知道正在运行什么消息
|
|
144
144
|
logger_prefix: str = '' # 日志名字前缀,可以设置前缀
|
|
145
145
|
create_logger_file: bool = True # 发布者和消费者是否创建文件文件日志,为False则只打印控制台不写文件.
|
|
146
|
+
logger_name: str = '' # 队列消费者发布者的日志命名空间.
|
|
146
147
|
log_filename: typing.Union[str, None] = None # 消费者发布者的文件日志名字.如果为None,则自动使用 funboost.队列 名字作为文件日志名字. 日志文件夹是在nb_log_config.py的 LOG_PATH中决定的.
|
|
147
148
|
is_show_message_get_from_broker: bool = False # 运行时候,是否记录从消息队列获取出来的消息内容
|
|
148
149
|
is_print_detail_exception: bool = True # 消费函数出错时候,是否打印详细的报错堆栈,为False则只打印简略的报错信息不包含堆栈.
|
|
@@ -160,7 +161,7 @@ class BoosterParams(BaseJsonAbleModel):
|
|
|
160
161
|
is_using_rpc_mode: bool = False # 是否使用rpc模式,可以在发布端获取消费端的结果回调,但消耗一定性能,使用async_result.result时候会等待阻塞住当前线程。
|
|
161
162
|
rpc_result_expire_seconds: int = 600 # 保存rpc结果的过期时间.
|
|
162
163
|
|
|
163
|
-
is_support_remote_kill_task: bool = False # 是否支持远程任务杀死功能,如果任务数量少,单个任务耗时长,确实需要远程发送命令来杀死正在运行的函数,才设置为true,否则不建议开启此功能。
|
|
164
|
+
is_support_remote_kill_task: bool = False # 是否支持远程任务杀死功能,如果任务数量少,单个任务耗时长,确实需要远程发送命令来杀死正在运行的函数,才设置为true,否则不建议开启此功能。(是把函数放在单独的线程中实现的,随时准备线程被远程命令杀死,所以性能会降低)
|
|
164
165
|
|
|
165
166
|
is_do_not_run_by_specify_time_effect: bool = False # 是否使不运行的时间段生效
|
|
166
167
|
do_not_run_by_specify_time: tuple = ('10:00:00', '22:00:00') # 不运行的时间段,在这个时间段自动不运行函数.
|
|
@@ -193,7 +194,7 @@ class BoosterParams(BaseJsonAbleModel):
|
|
|
193
194
|
# if not set(values.keys()).issubset(set(BoosterParams.__fields__.keys())):
|
|
194
195
|
# raise ValueError(f'{cls.__name__} 的字段包含了父类 BoosterParams 不存在的字段')
|
|
195
196
|
for k in values.keys():
|
|
196
|
-
if k not in BoosterParams.
|
|
197
|
+
if k not in BoosterParams.model_fields.keys():
|
|
197
198
|
raise ValueError(f'{cls.__name__} 的字段新增了父类 BoosterParams 不存在的字段 "{k}"') # 使 BoosterParams的子类,不能增加字段,只能覆盖字段.
|
|
198
199
|
return values
|
|
199
200
|
|
|
@@ -224,7 +225,7 @@ class PriorityConsumingControlConfig(BaseJsonAbleModel):
|
|
|
224
225
|
例如消费为add函数,可以每个独立的任务设置不同的超时时间,不同的重试次数,是否使用rpc模式。这里的配置优先,可以覆盖生成消费者时候的配置。
|
|
225
226
|
"""
|
|
226
227
|
|
|
227
|
-
function_timeout: typing.Union[float, int] =
|
|
228
|
+
function_timeout: typing.Union[float, int] = 0
|
|
228
229
|
max_retry_times: int = None
|
|
229
230
|
is_print_detail_exception: bool = None
|
|
230
231
|
msg_expire_senconds: int = None
|
|
@@ -248,6 +249,7 @@ class PublisherParams(BaseJsonAbleModel):
|
|
|
248
249
|
log_level: int = logging.DEBUG
|
|
249
250
|
logger_prefix: str = ''
|
|
250
251
|
create_logger_file: bool = True
|
|
252
|
+
logger_name: str = '' # 队列消费者发布者的日志命名空间.
|
|
251
253
|
log_filename: typing.Optional[str] = None
|
|
252
254
|
clear_queue_within_init: bool = False # with 语法发布时候,先清空消息队列
|
|
253
255
|
consuming_function: typing.Callable = None # consuming_function 作用是 inspect 模块获取函数的入参信息
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from funboost.utils.decorators import cached_method_result
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class LazyImpoter:
|
|
5
|
+
"""
|
|
6
|
+
延迟导入,避免需要互相导入.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
@property
|
|
10
|
+
@cached_method_result
|
|
11
|
+
def BoostersManager(self):
|
|
12
|
+
from funboost.core.booster import BoostersManager
|
|
13
|
+
return BoostersManager
|
|
14
|
+
|
|
15
|
+
# @property
|
|
16
|
+
# @cached_method_result
|
|
17
|
+
# def get_current_taskid(self):
|
|
18
|
+
# from funboost.core.current_task import get_current_taskid
|
|
19
|
+
# return get_current_taskid
|
|
20
|
+
|
|
21
|
+
lazy_impoter = LazyImpoter()
|
|
22
|
+
|
|
23
|
+
if __name__ == '__main__':
|
|
24
|
+
for i in range(10000):
|
|
25
|
+
lazy_impoter.BoostersManager
|
|
26
|
+
lazy_impoter.BoostersManager
|
|
@@ -7,12 +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
|
-
|
|
10
|
+
from funboost.core.lazy_impoter import lazy_impoter
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
def _run_consumer_in_new_process(queue_name, ):
|
|
14
|
-
|
|
15
|
-
booster_current_pid = BoostersManager.get_or_create_booster_by_queue_name(queue_name)
|
|
14
|
+
booster_current_pid = lazy_impoter.BoostersManager.get_or_create_booster_by_queue_name(queue_name)
|
|
16
15
|
# booster_current_pid = boost(**boost_params)(consuming_function)
|
|
17
16
|
booster_current_pid.consume()
|
|
18
17
|
# ConsumersManager.join_all_consumer_shedual_task_thread()
|
|
@@ -50,8 +49,7 @@ def run_consumer_with_multi_process(booster: Booster, process_num=1):
|
|
|
50
49
|
|
|
51
50
|
|
|
52
51
|
def _multi_process_pub_params_list_in_new_process(queue_name, msgs: List[dict]):
|
|
53
|
-
|
|
54
|
-
booster_current_pid = BoostersManager.get_or_create_booster_by_queue_name(queue_name)
|
|
52
|
+
booster_current_pid = lazy_impoter.BoostersManager.get_or_create_booster_by_queue_name(queue_name)
|
|
55
53
|
publisher = booster_current_pid.publisher
|
|
56
54
|
publisher.set_log_level(20) # 超高速发布,如果打印详细debug日志会卡死屏幕和严重降低代码速度。
|
|
57
55
|
for msg in msgs:
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import functools
|
|
2
|
+
|
|
3
|
+
from nb_log import CompatibleLogger
|
|
4
|
+
from funboost.core.current_task import get_current_taskid
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class TaskIdLogger(CompatibleLogger):
|
|
8
|
+
"""
|
|
9
|
+
如果你要使用带taskid的日志模板,一定要使用
|
|
10
|
+
LogManager('namexx',logger_cls=TaskIdLogger).get_logger_and_add_handlers(....)
|
|
11
|
+
的方式来创建logger, 就是需要指定logger_cls=TaskIdLogger ,否则的话你需要在打印日志时候 手动传递extra logger.info(msg,extra={'task_id':task_idxxx})
|
|
12
|
+
"""
|
|
13
|
+
def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False):
|
|
14
|
+
extra = extra or {}
|
|
15
|
+
if 'task_id' not in extra:
|
|
16
|
+
extra['task_id'] = get_current_taskid()
|
|
17
|
+
if 'sys_getframe_n' not in extra:
|
|
18
|
+
extra['sys_getframe_n'] = 3
|
|
19
|
+
super()._log(level, msg, args, exc_info, extra, stack_info)
|
|
@@ -5,6 +5,7 @@ import pytz
|
|
|
5
5
|
from funboost.constant import BrokerEnum, ConcurrentModeEnum
|
|
6
6
|
from funboost.core.func_params_model import FunctionResultStatusPersistanceConfig
|
|
7
7
|
from funboost.utils.simple_data_class import DataClassBase
|
|
8
|
+
from nb_log import nb_log_config_default
|
|
8
9
|
|
|
9
10
|
'''
|
|
10
11
|
funboost_config.py 文件是第一次运行框架自动生成到你的项目根目录的,不需要用由户手动创建。
|
|
@@ -96,7 +97,11 @@ class BrokerConnConfig(DataClassBase):
|
|
|
96
97
|
|
|
97
98
|
class FunboostCommonConfig(DataClassBase):
|
|
98
99
|
# nb_log包的第几个日志模板,内置了7个模板,可以在你当前项目根目录下的nb_log_config.py文件扩展模板。
|
|
99
|
-
NB_LOG_FORMATER_INDEX_FOR_CONSUMER_AND_PUBLISHER = 11 # 7是简短的不可跳转,5是可点击跳转的,11是可显示ip 进程
|
|
100
|
+
# NB_LOG_FORMATER_INDEX_FOR_CONSUMER_AND_PUBLISHER = 11 # 7是简短的不可跳转,5是可点击跳转的,11是可显示ip 进程 线程的模板,也可以亲自设置日志模板不传递数字。
|
|
101
|
+
NB_LOG_FORMATER_INDEX_FOR_CONSUMER_AND_PUBLISHER = logging.Formatter(
|
|
102
|
+
f'%(asctime)s-({nb_log_config_default.computer_ip},{nb_log_config_default.computer_name})-[p%(process)d_t%(thread)d] - %(name)s - "%(filename)s:%(lineno)d" - %(funcName)s - %(levelname)s - %(task_id)s - %(message)s',
|
|
103
|
+
"%Y-%m-%d %H:%M:%S",) # 这个是带task_id的日志模板,日志可以显示task_id,方便用户串联起来排查某一个人物消息的所有日志.
|
|
104
|
+
|
|
100
105
|
TIMEZONE = 'Asia/Shanghai' # 时区
|
|
101
106
|
|
|
102
107
|
# 以下配置是修改funboost的一些命名空间和启动时候的日志级别,新手不熟练就别去屏蔽日志了
|
|
@@ -26,6 +26,7 @@ from pikav1.exceptions import AMQPError as PikaAMQPError
|
|
|
26
26
|
# from nb_log import LoggerLevelSetterMixin, LoggerMixin
|
|
27
27
|
from funboost.core.loggers import LoggerLevelSetterMixin, FunboostFileLoggerMixin, get_logger
|
|
28
28
|
from funboost.core.msg_result_getter import AsyncResult, AioAsyncResult
|
|
29
|
+
from funboost.core.task_id_logger import TaskIdLogger
|
|
29
30
|
from funboost.utils import decorators, time_util
|
|
30
31
|
from funboost.funboost_config_deafult import BrokerConnConfig, FunboostCommonConfig
|
|
31
32
|
|
|
@@ -158,13 +159,13 @@ class AbstractPublisher(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
158
159
|
logger_prefix = self.publisher_params.logger_prefix
|
|
159
160
|
if logger_prefix != '':
|
|
160
161
|
logger_prefix += '--'
|
|
161
|
-
logger_name = f'funboost.{logger_prefix}{self.__class__.__name__}--{self.queue_name}'
|
|
162
|
-
log_filename = self.publisher_params.log_filename or f'funboost.{self.queue_name}.log'
|
|
163
|
-
self.logger =
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
162
|
+
self.logger_name = self.publisher_params.logger_name or f'funboost.{logger_prefix}{self.__class__.__name__}--{self.queue_name}'
|
|
163
|
+
self.log_filename = self.publisher_params.log_filename or f'funboost.{self.queue_name}.log'
|
|
164
|
+
self.logger = nb_log.LogManager(self.logger_name, logger_cls=TaskIdLogger).get_logger_and_add_handlers(
|
|
165
|
+
log_level_int=self.publisher_params.log_level,
|
|
166
|
+
log_filename=self.log_filename if self.publisher_params.create_logger_file else None,
|
|
167
|
+
error_log_filename=nb_log.generate_error_file_name(self.log_filename),
|
|
168
|
+
formatter_template=FunboostCommonConfig.NB_LOG_FORMATER_INDEX_FOR_CONSUMER_AND_PUBLISHER, )
|
|
168
169
|
|
|
169
170
|
def _init_count(self):
|
|
170
171
|
self._current_time = time.time()
|
|
@@ -213,7 +214,7 @@ class AbstractPublisher(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
213
214
|
decorators.handle_exception(retry_times=10, is_throw_error=True, time_sleep=0.1)(
|
|
214
215
|
self.concrete_realization_of_publish)(json.dumps(msg, ensure_ascii=False))
|
|
215
216
|
|
|
216
|
-
self.logger.debug(f'向{self._queue_name} 队列,推送消息 耗时{round(time.time() - t_start, 4)}秒 {msg_function_kw}') # 显示msg太长了。
|
|
217
|
+
self.logger.debug(f'向{self._queue_name} 队列,推送消息 耗时{round(time.time() - t_start, 4)}秒 {msg_function_kw}', extra={'task_id': task_id}) # 显示msg太长了。
|
|
217
218
|
with self._lock_for_count:
|
|
218
219
|
self.count_per_minute += 1
|
|
219
220
|
self.publish_msg_num_total += 1
|
|
@@ -223,9 +224,9 @@ class AbstractPublisher(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
223
224
|
self._init_count()
|
|
224
225
|
return AsyncResult(task_id)
|
|
225
226
|
|
|
226
|
-
def send_msg(self,msg:typing.Union[dict,str]):
|
|
227
|
+
def send_msg(self, msg: typing.Union[dict, str]):
|
|
227
228
|
"""直接发送任意消息内容到消息队列,不生成辅助参数,无视函数入参名字,不校验入参个数和键名"""
|
|
228
|
-
if isinstance(msg,dict):
|
|
229
|
+
if isinstance(msg, dict):
|
|
229
230
|
msg = json.dumps(msg, ensure_ascii=False)
|
|
230
231
|
decorators.handle_exception(retry_times=10, is_throw_error=True, time_sleep=0.1)(
|
|
231
232
|
self.concrete_realization_of_publish)(msg)
|
funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc
CHANGED
|
Binary file
|
|
@@ -9,12 +9,14 @@
|
|
|
9
9
|
'''
|
|
10
10
|
|
|
11
11
|
import copy
|
|
12
|
+
import functools
|
|
12
13
|
import inspect
|
|
13
14
|
import threading
|
|
14
15
|
import time
|
|
15
16
|
import types
|
|
16
17
|
import sys
|
|
17
18
|
|
|
19
|
+
|
|
18
20
|
from .exceptions import FunctionTimedOut
|
|
19
21
|
from .StoppableThread import StoppableThread
|
|
20
22
|
|
|
@@ -27,6 +29,8 @@ from functools import wraps
|
|
|
27
29
|
__all__ = ('func_timeout', 'func_set_timeout')
|
|
28
30
|
|
|
29
31
|
|
|
32
|
+
|
|
33
|
+
|
|
30
34
|
def func_timeout(timeout, func, args=(), kwargs=None):
|
|
31
35
|
'''
|
|
32
36
|
func_timeout - Runs the given function for up to #timeout# seconds.
|
|
@@ -60,7 +64,11 @@ def func_timeout(timeout, func, args=(), kwargs=None):
|
|
|
60
64
|
exception = []
|
|
61
65
|
isStopped = False
|
|
62
66
|
|
|
63
|
-
|
|
67
|
+
from funboost.core.current_task import thread_current_task
|
|
68
|
+
|
|
69
|
+
def funcwrap(args2, kwargs2,_fct_local_data_dict):
|
|
70
|
+
fct = thread_current_task
|
|
71
|
+
fct._fct_local_data.__dict__.update(_fct_local_data_dict) # 把funboost的消费线程上下文需要传递到超时线程上下文里面来.
|
|
64
72
|
try:
|
|
65
73
|
ret.append( func(*args2, **kwargs2) )
|
|
66
74
|
except FunctionTimedOut:
|
|
@@ -76,7 +84,9 @@ def func_timeout(timeout, func, args=(), kwargs=None):
|
|
|
76
84
|
e.__traceback__ = exc_info[2].tb_next
|
|
77
85
|
exception.append( e )
|
|
78
86
|
|
|
79
|
-
|
|
87
|
+
|
|
88
|
+
# fct = funboost_current_task()
|
|
89
|
+
thread = StoppableThread(target=funcwrap, args=(args, kwargs,thread_current_task._fct_local_data.__dict__))
|
|
80
90
|
thread.daemon = True
|
|
81
91
|
|
|
82
92
|
thread.start()
|
funboost/utils/mongo_util.py
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
# @Author : ydf
|
|
3
3
|
# @Time : 2022/9/17 0017 15:26
|
|
4
|
+
import functools
|
|
4
5
|
import os
|
|
5
6
|
import pymongo
|
|
6
|
-
from funboost.funboost_config_deafult import BrokerConnConfig
|
|
7
7
|
from funboost.utils import decorators
|
|
8
8
|
|
|
9
9
|
|
|
10
|
+
@functools.lru_cache()
|
|
11
|
+
def _get_mongo_url():
|
|
12
|
+
from funboost.funboost_config_deafult import BrokerConnConfig
|
|
13
|
+
return BrokerConnConfig.MONGO_CONNECT_URL
|
|
14
|
+
|
|
10
15
|
class MongoMixin0000:
|
|
11
16
|
"""
|
|
12
17
|
mixin类被继承,也可以直接实例化。
|
|
@@ -20,7 +25,7 @@ class MongoMixin0000:
|
|
|
20
25
|
@property
|
|
21
26
|
@decorators.cached_method_result
|
|
22
27
|
def mongo_client(self):
|
|
23
|
-
return pymongo.MongoClient(
|
|
28
|
+
return pymongo.MongoClient(_get_mongo_url(), connect=False) # connect等于False原因见注释
|
|
24
29
|
|
|
25
30
|
@property
|
|
26
31
|
@decorators.cached_method_result
|
|
@@ -46,7 +51,7 @@ class MongoMixin:
|
|
|
46
51
|
pid = os.getpid()
|
|
47
52
|
key = pid
|
|
48
53
|
if key not in MongoMixin.processid__client_map:
|
|
49
|
-
MongoMixin.processid__client_map[key] = pymongo.MongoClient(
|
|
54
|
+
MongoMixin.processid__client_map[key] = pymongo.MongoClient(_get_mongo_url(),
|
|
50
55
|
connect=False, maxIdleTimeMS=60 * 1000, minPoolSize=3, maxPoolSize=20)
|
|
51
56
|
return MongoMixin.processid__client_map[key]
|
|
52
57
|
|
funboost/utils/time_util.py
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
# coding=utf-8
|
|
2
|
+
import functools
|
|
2
3
|
import typing
|
|
3
4
|
import datetime
|
|
4
5
|
import time
|
|
5
6
|
import re
|
|
6
7
|
import pytz
|
|
7
|
-
|
|
8
|
+
|
|
8
9
|
|
|
9
10
|
from funboost.utils import nb_print
|
|
10
11
|
|
|
12
|
+
@functools.lru_cache()
|
|
13
|
+
def _get_funboost_timezone():
|
|
14
|
+
from funboost.funboost_config_deafult import FunboostCommonConfig
|
|
15
|
+
return FunboostCommonConfig.TIMEZONE
|
|
11
16
|
|
|
12
17
|
def build_defualt_date():
|
|
13
18
|
"""
|
|
@@ -78,11 +83,11 @@ class DatetimeConverter:
|
|
|
78
83
|
elif isinstance(datetimex, (int, float)):
|
|
79
84
|
if datetimex < 1:
|
|
80
85
|
datetimex += 86400
|
|
81
|
-
self.datetime_obj = datetime.datetime.fromtimestamp(datetimex, tz=pytz.timezone(
|
|
86
|
+
self.datetime_obj = datetime.datetime.fromtimestamp(datetimex, tz=pytz.timezone(_get_funboost_timezone())) # 时间戳0在windows会出错。
|
|
82
87
|
elif isinstance(datetimex, datetime.datetime):
|
|
83
88
|
self.datetime_obj = datetimex
|
|
84
89
|
elif datetimex is None:
|
|
85
|
-
self.datetime_obj = datetime.datetime.now(tz=pytz.timezone(
|
|
90
|
+
self.datetime_obj = datetime.datetime.now(tz=pytz.timezone(_get_funboost_timezone()))
|
|
86
91
|
else:
|
|
87
92
|
raise ValueError('实例化时候的传参不符合规定')
|
|
88
93
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: funboost
|
|
3
|
-
Version:
|
|
3
|
+
Version: 43.1
|
|
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
|
|
@@ -26,7 +26,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
26
26
|
Classifier: Topic :: Software Development :: Libraries
|
|
27
27
|
Description-Content-Type: text/markdown
|
|
28
28
|
License-File: LICENSE
|
|
29
|
-
Requires-Dist: nb-log >=12.
|
|
29
|
+
Requires-Dist: nb-log >=12.4
|
|
30
30
|
Requires-Dist: eventlet ==0.33.3
|
|
31
31
|
Requires-Dist: gevent ==22.10.2
|
|
32
32
|
Requires-Dist: pymongo ==4.3.3
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
funboost/__init__.py,sha256=
|
|
1
|
+
funboost/__init__.py,sha256=pUJ4iS5AiUCxH6utC0qcxgNhw2bNTzZdZQruG3ITny8,3832
|
|
2
2
|
funboost/__init__old.py,sha256=07A1MLsxLtuRQQOIfDyphddOwNBrGe34enoHWAnjV14,20379
|
|
3
3
|
funboost/__main__.py,sha256=-6Nogi666Y0LN8fVm3JmHGTOk8xEGWvotW_GDbSaZME,1065
|
|
4
|
-
funboost/constant.py,sha256=
|
|
5
|
-
funboost/funboost_config_deafult.py,sha256=
|
|
4
|
+
funboost/constant.py,sha256=Yxt3WJt9D8ybcrgiojOy0qjnq5mffwTnTJplerGL0Oo,7188
|
|
5
|
+
funboost/funboost_config_deafult.py,sha256=YRU4TyJ_OTcnX_ReC7i7Dx_eLP0OmbiLAbCZD1yVeV4,6613
|
|
6
6
|
funboost/set_frame_config.py,sha256=bEsW4a4EuE3PpyypNuWSfsB-_bvT94pktJGKk4r-rlo,14328
|
|
7
7
|
funboost/assist/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
8
|
funboost/assist/celery_helper.py,sha256=ae8nbwHEulXa9gSKrNkW87SS8BZx7ZJwzWYY6hniE2g,5603
|
|
@@ -33,7 +33,7 @@ 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=
|
|
36
|
+
funboost/consumers/base_consumer.py,sha256=fRP9oHn8yt2Te0zPg6e5SvuOgS6RaciX8lcn8y_Fphs,73843
|
|
37
37
|
funboost/consumers/celery_consumer.py,sha256=W25gbGyimf8KG5lLbtgar3Ix7F3O4cIRBLtRq8nJ0AE,9216
|
|
38
38
|
funboost/consumers/confirm_mixin.py,sha256=eY6fNwx51Hn4bQSYRjyTRwOqfCGsikVnd2Ga_Ep31N4,6062
|
|
39
39
|
funboost/consumers/dramatiq_consumer.py,sha256=ozmeAfeF0U-YNYHK4suQB0N264h5AZdfMH0O45Mh-8A,2229
|
|
@@ -82,20 +82,22 @@ funboost/contrib/save_result_status_to_sqldb.py,sha256=AxvD7nHs4sjr9U0kwEZzyPKrs
|
|
|
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
84
|
funboost/core/booster.py,sha256=k6UPxfW7QdhfdVu9yprHkF46jLO2eXTqTZPYkukmyZc,15741
|
|
85
|
-
funboost/core/current_task.py,sha256=
|
|
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=KPjifNy1G1tDOT2eaR0X8hegot0HUk5vF-P1DnhxME4,8941
|
|
88
|
-
funboost/core/func_params_model.py,sha256=
|
|
88
|
+
funboost/core/func_params_model.py,sha256=ChxvSq_iVuYnGR_CdN9h9qNtvBq8sZ4BocdzCjgsQHc,18167
|
|
89
89
|
funboost/core/function_result_status_config.py,sha256=PyjqAQOiwsLt28sRtH-eYRjiI3edPFO4Nde0ILFRReE,1764
|
|
90
90
|
funboost/core/function_result_status_saver.py,sha256=UdokGSwU630t70AZnT9Ecj7GpYXORBDivlc9kadoI2E,9172
|
|
91
91
|
funboost/core/helper_funs.py,sha256=M9Ad9EzgHdP581X-vuFgCavJRoezLGXlXSFg7zyMWD0,1578
|
|
92
92
|
funboost/core/kill_remote_task.py,sha256=MZ5vWLGt6SxyN76h5Lf_id9tyVUzjR-qXNyJwXaGlZY,8129
|
|
93
|
+
funboost/core/lazy_impoter.py,sha256=DEVcRGieYQA_3pMKGyrKeB24eQJKEY5F7Qe3w1q61k4,670
|
|
93
94
|
funboost/core/loggers.py,sha256=173aXdqE8nAe8t6OcVMNAFsCUClVrWQovdQhTAg9IyM,2407
|
|
94
95
|
funboost/core/msg_result_getter.py,sha256=oZDuLDR5XQNzzvgDTsA7wroICToPwrkU9-OAaXXUQSk,8031
|
|
95
|
-
funboost/core/muliti_process_enhance.py,sha256=
|
|
96
|
+
funboost/core/muliti_process_enhance.py,sha256=64rkVa5Eel-0EY2B7lc1dQTRwX4ehARVvcxQVDa6jr0,3568
|
|
97
|
+
funboost/core/task_id_logger.py,sha256=lR19HQcX6Pp8laURCD656xNpF_JP6nLB3zUKI69EWzE,864
|
|
96
98
|
funboost/core/try_get_user_funboost_common_config.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
97
99
|
funboost/core/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
98
|
-
funboost/core/cli/discovery_boosters.py,sha256=
|
|
100
|
+
funboost/core/cli/discovery_boosters.py,sha256=UOtmbAsRduMe8Xe6NHJ11c3w7BbsxmqfOIdcWmK_qpE,3926
|
|
99
101
|
funboost/core/cli/funboost_cli_user_templ.py,sha256=XUpKLxRKtYfebPUM8wii64kB0HW8L7j9LnRpT0xCfQI,2243
|
|
100
102
|
funboost/core/cli/funboost_fire.py,sha256=OT0SNi9Zb0Tom2E0cWuArQs0obUowAA_rpCF7GdaKPs,5065
|
|
101
103
|
funboost/factories/__init__.py,sha256=s7kKKjR1HU5eMjPD6r5b-SXTVMo1zBp2JjOAtkyt5Yo,178
|
|
@@ -120,7 +122,7 @@ funboost/function_result_web/static/js/jquery-1.11.0.min.js,sha256=ryQZ3RXgnqkTz
|
|
|
120
122
|
funboost/function_result_web/templates/index.html,sha256=YM0582Q4t2da-xBf3Ga0McIfcsT9H98rjZck-irMkGo,20387
|
|
121
123
|
funboost/function_result_web/templates/login.html,sha256=q37dj7O0LeyiV38Zd5P1Qn_qmhjdFomuYTRY1Yk48Bo,2007
|
|
122
124
|
funboost/publishers/__init__.py,sha256=xqBHlvsJQVPfbdvP84G0LHmVB7-pFBS7vDnX1Uo9pVY,131
|
|
123
|
-
funboost/publishers/base_publisher.py,sha256=
|
|
125
|
+
funboost/publishers/base_publisher.py,sha256=q78zraFleZv4YkVABFW1WEwMIgZ0TKozJZkp6RbwHXc,15070
|
|
124
126
|
funboost/publishers/celery_publisher.py,sha256=uc9N1uLW74skUCw8dsnvxORM2O3cy4SiI7tUZRmvkHA,2336
|
|
125
127
|
funboost/publishers/celery_publisher000.py,sha256=2XLOyU2__vlIUTi5L15uf0BJqAIjxbc3kCLIRDSOY9w,3966
|
|
126
128
|
funboost/publishers/confluent_kafka_publisher.py,sha256=gC4SUk6I_7zjSngcbTI7oTJ7sza3oE3PE19KQkwCpn4,4802
|
|
@@ -173,7 +175,7 @@ funboost/utils/decorators.py,sha256=phLa1u_W8wuhkVNVesRU6zjWA_b4sONfrvzO_sPVdtw,
|
|
|
173
175
|
funboost/utils/develop_log.py,sha256=Wsx0ongGjTit5xqgk1BztYlVEkC6d0-Y7GENXLedVqY,271
|
|
174
176
|
funboost/utils/expire_lock.py,sha256=AOkd1KlvZeIwQaz8ZoKxLpGxWgqQ4mfNHcFphh04o8Q,4732
|
|
175
177
|
funboost/utils/json_helper.py,sha256=HDdtLyZBGpWbUm7vmTypKXd8K-Hb-9BaxpdmRlKMYUI,1849
|
|
176
|
-
funboost/utils/mongo_util.py,sha256=
|
|
178
|
+
funboost/utils/mongo_util.py,sha256=g2AdsanKm2v9X-OaTCS6hx_0JvRw5WukXIttN3TD9sI,3069
|
|
177
179
|
funboost/utils/monkey_color_log.py,sha256=QChhQMTB6phZ2eBaPq-9tFZF1n7pWeJgmJPIB_ugkvs,7367
|
|
178
180
|
funboost/utils/monkey_patches.py,sha256=vGmtPuTwNLbS8T3gpufSC_cD8_Vnp85roZrCpJZUSE4,2890
|
|
179
181
|
funboost/utils/mqtt_util.py,sha256=BfCmyYwI-B8VL9499_IuYlJDCbv6ZhwyWThMf8dANOU,3199
|
|
@@ -184,7 +186,7 @@ funboost/utils/redis_manager_old.py,sha256=c3RBXN6dM3kjVBqkCdotpZuYmFs4d9emfp5iJ
|
|
|
184
186
|
funboost/utils/resource_monitoring.py,sha256=vf1htYa3a4wlMfQqksvIINMw8laiXwG5N8NXU2Zm3qQ,5532
|
|
185
187
|
funboost/utils/restart_python.py,sha256=bFbV0_24ajL8hBwVRLxWe9v9kTwiX1fGLhXRroNnmgQ,1418
|
|
186
188
|
funboost/utils/simple_data_class.py,sha256=CPiiywEAUSK4eKIxGlzOua1ZSkO_sVsMt157i8MwWO0,1543
|
|
187
|
-
funboost/utils/time_util.py,sha256=
|
|
189
|
+
funboost/utils/time_util.py,sha256=smWhB0fdxgazBYI-t2E61mcIlBk78GcVnl2M8Ko8jVQ,5533
|
|
188
190
|
funboost/utils/un_strict_json_dumps.py,sha256=uh2mXNRCq5dJcqMhb9CkfvehfEGYZAgI6RY1oLcYX_M,408
|
|
189
191
|
funboost/utils/dependency_packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
190
192
|
funboost/utils/dependency_packages/mongomq/__init__.py,sha256=yP7LHPsZ5ResiexksmtyJc9HGbMJWwZ0gOvHk2vNcz0,131
|
|
@@ -236,7 +238,7 @@ funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpyt
|
|
|
236
238
|
funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-39.pyc,sha256=UyZJDglEyha0S4-6X4Jno7rAOPbXq6E-km0Fi_JnsJU,2017
|
|
237
239
|
funboost/utils/dependency_packages_in_pythonpath/func_timeout/StoppableThread.py,sha256=mvlE6n4bPDVem2cVBJLItEG_JEQhCogLjukFkJKF8c8,5246
|
|
238
240
|
funboost/utils/dependency_packages_in_pythonpath/func_timeout/__init__.py,sha256=rnAnFnfFPy5_x3lw4xcRJ_fzjHZuxWrdLdVujqglHwg,587
|
|
239
|
-
funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py,sha256=
|
|
241
|
+
funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py,sha256=8BTxwQ70mNWvUxy_6Yx83PDLv-00RlCDRuuDLw5-PoY,9669
|
|
240
242
|
funboost/utils/dependency_packages_in_pythonpath/func_timeout/exceptions.py,sha256=tUEaspemq_dS460EQvUMMSxeeyjIbgfEHIdxIC6ZhaU,3974
|
|
241
243
|
funboost/utils/dependency_packages_in_pythonpath/func_timeout/py2_raise.py,sha256=9tpZLQ3-zIgU_ixazydwZmw8rFg7ybjI9alNYfSvwRk,169
|
|
242
244
|
funboost/utils/dependency_packages_in_pythonpath/func_timeout/py3_raise.py,sha256=Odvg1FtXTEC--Ru1EIfsHASamBpOm9hdXY7OnlEUObA,280
|
|
@@ -247,7 +249,7 @@ funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init
|
|
|
247
249
|
funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-37.pyc,sha256=ACdP5kS3R-5Bt2Qk-sq6RHF3LaOyywwVyM9R7L8m1-Q,763
|
|
248
250
|
funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-39.pyc,sha256=5J3PkkFxVDKw4aFL59LwtJC5SDtteQT9ibIBR_1DkF8,767
|
|
249
251
|
funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-311.pyc,sha256=lm1W6uTCo09YyK_P5WNpBr1dBMMBwl8Pt6ItwMyBNGA,11447
|
|
250
|
-
funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc,sha256=
|
|
252
|
+
funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc,sha256=dgBdmSIDLMUNKHImidPAVUCMCD2PxjWv2mwtM932L4U,8392
|
|
251
253
|
funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-39.pyc,sha256=aYRhjAhdcweDRI_wlh1UU_tFnWHr9at5Ywz-p6tw0QI,8001
|
|
252
254
|
funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-311.pyc,sha256=9v_YQPA5cUlVs-3UHbVwfiIE8UBzPD1HyWzApfBSR7Y,4592
|
|
253
255
|
funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-37.pyc,sha256=UXQJRMqqUOpudiCLxFYM2RWF8JXerjUttXl6Fiw55OE,3708
|
|
@@ -262,9 +264,9 @@ funboost/utils/pysnooper_ydf/utils.py,sha256=evSmGi_Oul7vSP47AJ0DLjFwoCYCfunJZ1m
|
|
|
262
264
|
funboost/utils/pysnooper_ydf/variables.py,sha256=QejRDESBA06KG9OH4sBT4J1M55eaU29EIHg8K_igaXo,3693
|
|
263
265
|
funboost/utils/times/__init__.py,sha256=Y4bQD3SIA_E7W2YvHq2Qdi0dGM4H2DxyFNdDOuFOq1w,2417
|
|
264
266
|
funboost/utils/times/version.py,sha256=11XfnZVVzOgIhXXdeN_mYfdXThfrsbQHpA0wCjz-hpg,17
|
|
265
|
-
funboost-
|
|
266
|
-
funboost-
|
|
267
|
-
funboost-
|
|
268
|
-
funboost-
|
|
269
|
-
funboost-
|
|
270
|
-
funboost-
|
|
267
|
+
funboost-43.1.dist-info/LICENSE,sha256=9EPP2ktG_lAPB8PjmWV-c9BiaJHc_FP6pPLcUrUwx0E,11562
|
|
268
|
+
funboost-43.1.dist-info/METADATA,sha256=gff3PpG5XbihV95vroXQonZMfW48XwTiGyoEuUxfEw8,30477
|
|
269
|
+
funboost-43.1.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
|
|
270
|
+
funboost-43.1.dist-info/entry_points.txt,sha256=yMSSAGRzRAAhGyNNQHw24MooKlDZsaJ499_D6fPl58A,96
|
|
271
|
+
funboost-43.1.dist-info/top_level.txt,sha256=K8WuKnS6MRcEWxP1NvbmCeujJq6TEfbsB150YROlRw0,9
|
|
272
|
+
funboost-43.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|