funboost 42.9__py3-none-any.whl → 43.0__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/consumers/base_consumer.py +19 -13
- funboost/core/cli/discovery_boosters.py +2 -3
- funboost/core/current_task.py +53 -13
- funboost/core/func_params_model.py +4 -4
- funboost/core/lazy_impoter.py +25 -0
- funboost/core/muliti_process_enhance.py +3 -5
- funboost/core/task_id_logger.py +13 -0
- funboost/funboost_config_deafult.py +6 -1
- funboost/publishers/base_publisher.py +3 -2
- 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.0.dist-info}/METADATA +2 -2
- {funboost-42.9.dist-info → funboost-43.0.dist-info}/RECORD +20 -18
- {funboost-42.9.dist-info → funboost-43.0.dist-info}/LICENSE +0 -0
- {funboost-42.9.dist-info → funboost-43.0.dist-info}/WHEEL +0 -0
- {funboost-42.9.dist-info → funboost-43.0.dist-info}/entry_points.txt +0 -0
- {funboost-42.9.dist-info → funboost-43.0.dist-info}/top_level.txt +0 -0
funboost/__init__.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
|
|
@@ -229,12 +230,13 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
229
230
|
logger_prefix += '--'
|
|
230
231
|
# logger_name = f'{logger_prefix}{self.__class__.__name__}--{concurrent_name}--{queue_name}--{self.consuming_function.__name__}'
|
|
231
232
|
logger_name = f'funboost.{logger_prefix}{self.__class__.__name__}--{self.queue_name}'
|
|
233
|
+
self.logger_name = logger_name
|
|
232
234
|
log_filename = self.consumer_params.log_filename or f'funboost.{self.queue_name}.log'
|
|
233
|
-
self.logger =
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
235
|
+
self.logger = LogManager(logger_name, logger_cls=TaskIdLogger).get_logger_and_add_handlers(
|
|
236
|
+
log_level_int=self.consumer_params.log_level,
|
|
237
|
+
log_filename=log_filename if self.consumer_params.create_logger_file else None,
|
|
238
|
+
error_log_filename=nb_log.generate_error_file_name(log_filename),
|
|
239
|
+
formatter_template=FunboostCommonConfig.NB_LOG_FORMATER_INDEX_FOR_CONSUMER_AND_PUBLISHER, )
|
|
238
240
|
self.logger.info(f'队列 {self.queue_name} 的日志写入到 {nb_log_config_default.LOG_PATH} 文件夹的 {log_filename} 和 {nb_log.generate_error_file_name(log_filename)} 文件中')
|
|
239
241
|
|
|
240
242
|
def _check_broker_exclusive_config(self):
|
|
@@ -362,8 +364,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
362
364
|
key = 'apscheduler.redisjobstore_runonce'
|
|
363
365
|
if RedisMixin().redis_db_frame.sadd(key, runonce_uuid): # 这样可以阻止多次启动同队列名消费者 redis jobstore多次运行函数.
|
|
364
366
|
cls.logger_apscheduler.debug(f'延时任务用普通消息重新发布到普通队列 {msg}')
|
|
365
|
-
|
|
366
|
-
BoostersManager.get_or_create_booster_by_queue_name(queue_name).publish(msg)
|
|
367
|
+
LazyImpoter().BoostersManager.get_or_create_booster_by_queue_name(queue_name).publish(msg)
|
|
367
368
|
|
|
368
369
|
@abc.abstractmethod
|
|
369
370
|
def _shedual_task(self):
|
|
@@ -603,9 +604,10 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
603
604
|
t_start = time.time()
|
|
604
605
|
# function_result_status.run_times = current_retry_times + 1
|
|
605
606
|
fct = funboost_current_task()
|
|
606
|
-
fct.function_params=function_only_params
|
|
607
|
-
fct.full_msg=kw['body']
|
|
607
|
+
fct.function_params = function_only_params
|
|
608
|
+
fct.full_msg = kw['body']
|
|
608
609
|
fct.function_result_status = function_result_status
|
|
610
|
+
fct.logger = self.logger
|
|
609
611
|
try:
|
|
610
612
|
function_run = self.consuming_function
|
|
611
613
|
if self._consuming_function_is_asyncio:
|
|
@@ -633,6 +635,9 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
633
635
|
function_result_status.success = True
|
|
634
636
|
if self.consumer_params.log_level <= logging.DEBUG:
|
|
635
637
|
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] + ' 。。。。。 '
|
|
638
|
+
# print(funboost_current_task().task_id)
|
|
639
|
+
# print(fct.function_result_status.task_id)
|
|
640
|
+
# print(get_current_taskid())
|
|
636
641
|
self.logger.debug(f' 函数 {self.consuming_function.__name__} '
|
|
637
642
|
f'第{current_retry_times + 1}次 运行, 正确了,函数运行时间是 {round(time.time() - t_start, 4)} 秒,入参是 {function_only_params} , '
|
|
638
643
|
f'结果是 {result_str_to_be_print} {self._get_concurrent_info()} ')
|
|
@@ -768,6 +773,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
768
773
|
fct.function_params = function_only_params
|
|
769
774
|
fct.full_msg = kw['body']
|
|
770
775
|
fct.function_result_status = function_result_status
|
|
776
|
+
fct.logger = self.logger
|
|
771
777
|
try:
|
|
772
778
|
corotinue_obj = self.consuming_function(**function_only_params)
|
|
773
779
|
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 LazyImpoter
|
|
11
11
|
|
|
12
12
|
@flyweight
|
|
13
13
|
class BoosterDiscovery(FunboostFileLoggerMixin):
|
|
@@ -66,8 +66,7 @@ class BoosterDiscovery(FunboostFileLoggerMixin):
|
|
|
66
66
|
spec = importlib.util.spec_from_file_location('module', file_path)
|
|
67
67
|
module = importlib.util.module_from_spec(spec)
|
|
68
68
|
spec.loader.exec_module(module)
|
|
69
|
-
|
|
70
|
-
BoostersManager.show_all_boosters()
|
|
69
|
+
LazyImpoter().BoostersManager.show_all_boosters()
|
|
71
70
|
|
|
72
71
|
|
|
73
72
|
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,31 +45,52 @@ 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
|
|
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
|
|
90
|
+
|
|
91
|
+
@logger.setter
|
|
92
|
+
def logger(self, logger: logging.Logger):
|
|
93
|
+
self._fct_local_data.logger = logger
|
|
77
94
|
|
|
78
95
|
|
|
79
96
|
def is_asyncio_environment():
|
|
@@ -88,6 +105,7 @@ 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,36 @@ 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
|
+
|
|
116
146
|
|
|
117
147
|
def funboost_current_task():
|
|
118
148
|
return AsyncioCurrentTask() if is_asyncio_environment() else ThreadCurrentTask()
|
|
119
149
|
|
|
120
150
|
|
|
151
|
+
def get_current_taskid():
|
|
152
|
+
fct = funboost_current_task()
|
|
153
|
+
# return fct.function_result_status.task_id
|
|
154
|
+
try:
|
|
155
|
+
return fct.task_id # 不在funboost的消费函数里面就获取不到上下文了
|
|
156
|
+
except AttributeError as e:
|
|
157
|
+
# print(e,type(e))
|
|
158
|
+
return 'no_task_id'
|
|
159
|
+
|
|
121
160
|
if __name__ == '__main__':
|
|
122
161
|
print(is_asyncio_environment())
|
|
123
162
|
print()
|
|
124
163
|
for i in range(100000):
|
|
125
164
|
funboost_current_task()
|
|
165
|
+
print(get_current_taskid())
|
|
126
166
|
print()
|
|
@@ -138,7 +138,7 @@ 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 = '' # 日志名字前缀,可以设置前缀
|
|
@@ -160,7 +160,7 @@ class BoosterParams(BaseJsonAbleModel):
|
|
|
160
160
|
is_using_rpc_mode: bool = False # 是否使用rpc模式,可以在发布端获取消费端的结果回调,但消耗一定性能,使用async_result.result时候会等待阻塞住当前线程。
|
|
161
161
|
rpc_result_expire_seconds: int = 600 # 保存rpc结果的过期时间.
|
|
162
162
|
|
|
163
|
-
is_support_remote_kill_task: bool = False # 是否支持远程任务杀死功能,如果任务数量少,单个任务耗时长,确实需要远程发送命令来杀死正在运行的函数,才设置为true,否则不建议开启此功能。
|
|
163
|
+
is_support_remote_kill_task: bool = False # 是否支持远程任务杀死功能,如果任务数量少,单个任务耗时长,确实需要远程发送命令来杀死正在运行的函数,才设置为true,否则不建议开启此功能。(是把函数放在单独的线程中实现的,随时准备线程被远程命令杀死,所以性能会降低)
|
|
164
164
|
|
|
165
165
|
is_do_not_run_by_specify_time_effect: bool = False # 是否使不运行的时间段生效
|
|
166
166
|
do_not_run_by_specify_time: tuple = ('10:00:00', '22:00:00') # 不运行的时间段,在这个时间段自动不运行函数.
|
|
@@ -193,7 +193,7 @@ class BoosterParams(BaseJsonAbleModel):
|
|
|
193
193
|
# if not set(values.keys()).issubset(set(BoosterParams.__fields__.keys())):
|
|
194
194
|
# raise ValueError(f'{cls.__name__} 的字段包含了父类 BoosterParams 不存在的字段')
|
|
195
195
|
for k in values.keys():
|
|
196
|
-
if k not in BoosterParams.
|
|
196
|
+
if k not in BoosterParams.model_fields.keys():
|
|
197
197
|
raise ValueError(f'{cls.__name__} 的字段新增了父类 BoosterParams 不存在的字段 "{k}"') # 使 BoosterParams的子类,不能增加字段,只能覆盖字段.
|
|
198
198
|
return values
|
|
199
199
|
|
|
@@ -224,7 +224,7 @@ class PriorityConsumingControlConfig(BaseJsonAbleModel):
|
|
|
224
224
|
例如消费为add函数,可以每个独立的任务设置不同的超时时间,不同的重试次数,是否使用rpc模式。这里的配置优先,可以覆盖生成消费者时候的配置。
|
|
225
225
|
"""
|
|
226
226
|
|
|
227
|
-
function_timeout: typing.Union[float, int] =
|
|
227
|
+
function_timeout: typing.Union[float, int] = 0
|
|
228
228
|
max_retry_times: int = None
|
|
229
229
|
is_print_detail_exception: bool = None
|
|
230
230
|
msg_expire_senconds: int = None
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
|
|
22
|
+
if __name__ == '__main__':
|
|
23
|
+
for i in range(10000):
|
|
24
|
+
LazyImpoter().BoostersManager
|
|
25
|
+
LazyImpoter().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 LazyImpoter
|
|
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 = LazyImpoter().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 = LazyImpoter().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,13 @@
|
|
|
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
|
+
def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False):
|
|
9
|
+
extra = extra or {}
|
|
10
|
+
if 'task_id' not in extra:
|
|
11
|
+
extra['task_id'] = get_current_taskid()
|
|
12
|
+
extra['sys_getframe_n'] = 3
|
|
13
|
+
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
|
|
|
@@ -160,7 +161,7 @@ class AbstractPublisher(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
160
161
|
logger_prefix += '--'
|
|
161
162
|
logger_name = f'funboost.{logger_prefix}{self.__class__.__name__}--{self.queue_name}'
|
|
162
163
|
log_filename = self.publisher_params.log_filename or f'funboost.{self.queue_name}.log'
|
|
163
|
-
self.logger =
|
|
164
|
+
self.logger = nb_log.LogManager(logger_name,logger_cls=TaskIdLogger).get_logger_and_add_handlers(
|
|
164
165
|
log_level_int=self.publisher_params.log_level,
|
|
165
166
|
log_filename=log_filename if self.publisher_params.create_logger_file else None,
|
|
166
167
|
error_log_filename=nb_log.generate_error_file_name(log_filename),
|
|
@@ -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
|
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 ThreadCurrentTask
|
|
68
|
+
|
|
69
|
+
def funcwrap(args2, kwargs2,_fct_local_data_dict):
|
|
70
|
+
fct = ThreadCurrentTask()
|
|
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,ThreadCurrentTask()._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.0
|
|
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=NI7kJXtPqFdy-Ec4B5D7yZ_ZrMJATgNc6taBTimys1c,3832
|
|
2
2
|
funboost/__init__old.py,sha256=07A1MLsxLtuRQQOIfDyphddOwNBrGe34enoHWAnjV14,20379
|
|
3
3
|
funboost/__main__.py,sha256=-6Nogi666Y0LN8fVm3JmHGTOk8xEGWvotW_GDbSaZME,1065
|
|
4
4
|
funboost/constant.py,sha256=haAbx2cvTN9itPzBG4v3_ODIi1-RudvBj6s_QjniqjU,7162
|
|
5
|
-
funboost/funboost_config_deafult.py,sha256=
|
|
5
|
+
funboost/funboost_config_deafult.py,sha256=uiz0eiLNaZ7poKWdebEajexpFi4g2ddmQxJm2O_tMUw,6552
|
|
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=XGf6ykD8MgyBv782SH-_ySXRgXyPWqOIXHnrsv7fMWw,73716
|
|
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=PMY-5ANxAUdYoxwoJWD7hW5J6xnEFX3uTrndrGgyu7M,4763
|
|
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=hk2aUKfG2eIcfoj6yEerXg4X9emrUt3AmFBP4V5iCGw,18013
|
|
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=OlECyAt7JJewsKqSVYZHDG3ZifN3TjoMb6H4Dd8XCHU,642
|
|
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=GQ2ohI4kFlBHSmZtvnoG8-pYyxyPatCs4S8fpp1t6hc,3569
|
|
97
|
+
funboost/core/task_id_logger.py,sha256=McbJxLpRwTyrOpIZJkIYfB2z0Zduxm5F4_vFhMEVHKs,467
|
|
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=hwbYq8BlhXktw0qezDALMice8Pao4RKIEZ4raf-LInE,3816
|
|
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=aDtuj2w8Ad2qA0X7Z5N4KWz_-3uVw7os77undqbhvb8,15085
|
|
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=GgxgDs_9aLaGBUrjibGzVD6ahJGwUuRAaNnliIrQhSA,9667
|
|
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=XjkqdpT_VqoFfi2LzJ5TpYUAtfUpan-zCjbacxkeCeQ,8394
|
|
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.0.dist-info/LICENSE,sha256=9EPP2ktG_lAPB8PjmWV-c9BiaJHc_FP6pPLcUrUwx0E,11562
|
|
268
|
+
funboost-43.0.dist-info/METADATA,sha256=GBk3jqN0aSIzwkPLe8Yj96eRrCeIV6RbdrS-u7qzOt0,30477
|
|
269
|
+
funboost-43.0.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
|
|
270
|
+
funboost-43.0.dist-info/entry_points.txt,sha256=yMSSAGRzRAAhGyNNQHw24MooKlDZsaJ499_D6fPl58A,96
|
|
271
|
+
funboost-43.0.dist-info/top_level.txt,sha256=K8WuKnS6MRcEWxP1NvbmCeujJq6TEfbsB150YROlRw0,9
|
|
272
|
+
funboost-43.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|