funboost 46.5__py3-none-any.whl → 46.7__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 CHANGED
@@ -13,7 +13,7 @@ set_frame_config这个模块的 use_config_form_funboost_config_module() 是核
13
13
  这段注释说明和使用的用户无关,只和框架开发人员有关.
14
14
  '''
15
15
 
16
- __version__ = "46.5"
16
+ __version__ = "46.7"
17
17
 
18
18
  from funboost.set_frame_config import show_frame_config
19
19
 
@@ -40,6 +40,7 @@ from funboost.core.serialization import Serialization
40
40
  from funboost.core.task_id_logger import TaskIdLogger
41
41
  from funboost.constant import FunctionKind
42
42
 
43
+
43
44
  from nb_libs.path_helper import PathHelper
44
45
  from nb_log import (get_logger, LoggerLevelSetterMixin, LogManager, is_main_process,
45
46
  nb_log_config_default)
@@ -368,6 +369,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
368
369
 
369
370
  def _start_delay_task_scheduler(self):
370
371
  from funboost.timing_job import FsdfBackgroundScheduler
372
+ from funboost.timing_job import FunboostBackgroundSchedulerProcessJobsWithinRedisLock
371
373
  # print(self.consumer_params.delay_task_apsscheduler_jobstores_kind )
372
374
  if self.consumer_params.delay_task_apscheduler_jobstores_kind == 'redis':
373
375
  jobstores = {
@@ -376,13 +378,20 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
376
378
  run_times_key=f'funboost.apscheduler.{self.queue_name}.run_times',
377
379
  )
378
380
  }
381
+ self._delay_task_scheduler = FunboostBackgroundSchedulerProcessJobsWithinRedisLock(timezone=FunboostCommonConfig.TIMEZONE, daemon=False,
382
+ jobstores=jobstores # push 方法的序列化带thredignn.lock
383
+ )
384
+ self._delay_task_scheduler.set_process_jobs_redis_lock_key(f'funboost.BackgroundSchedulerProcessJobsWithinRedisLock.{self.queue_name}')
379
385
  elif self.consumer_params.delay_task_apscheduler_jobstores_kind == 'memory':
380
386
  jobstores = {"default": MemoryJobStore()}
387
+ self._delay_task_scheduler = FsdfBackgroundScheduler(timezone=FunboostCommonConfig.TIMEZONE, daemon=False,
388
+ jobstores=jobstores # push 方法的序列化带thredignn.lock
389
+ )
390
+
381
391
  else:
382
392
  raise Exception(f'delay_task_apsscheduler_jobstores_kind is error: {self.consumer_params.delay_task_apscheduler_jobstores_kind}')
383
- self._delay_task_scheduler = FsdfBackgroundScheduler(timezone=FunboostCommonConfig.TIMEZONE, daemon=False,
384
- jobstores=jobstores # push 方法的序列化带thredignn.lock
385
- )
393
+
394
+
386
395
  self._delay_task_scheduler.add_executor(ApschedulerThreadPoolExecutor(2)) # 只是运行submit任务到并发池,不需要很多线程。
387
396
  # self._delay_task_scheduler.add_listener(self._apscheduler_job_miss, EVENT_JOB_MISSED)
388
397
  self._delay_task_scheduler.start()
@@ -500,7 +509,8 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
500
509
  # 数据库作为apscheduler的jobstores时候, 不能用 self.pbulisher_of_same_queue.publish,self不能序列化
501
510
  self._delay_task_scheduler.add_job(self._push_for_apscheduler_use_database_store, 'date', run_date=run_date,
502
511
  kwargs={'queue_name': self.queue_name, 'msg': msg_no_delay, 'runonce_uuid': str(uuid.uuid4())},
503
- misfire_grace_time=misfire_grace_time)
512
+ misfire_grace_time=misfire_grace_time,
513
+ )
504
514
  self._confirm_consume(kw)
505
515
 
506
516
  else: # 普通任务
@@ -14,7 +14,7 @@ class RabbitmqConsumerAmqpStorm(AbstractConsumer):
14
14
  使用AmqpStorm实现的,多线程安全的,不用加锁。
15
15
  funboost 强烈推荐使用这个做消息队列中间件。
16
16
  """
17
- BROKER_EXCLUSIVE_CONFIG_DEFAULT = {'x-max-priority': None} # x-max-priority 是 rabbitmq的优先级队列配置,必须为整数,强烈建议要小于5。为None就代表队列不支持优先级。
17
+ BROKER_EXCLUSIVE_CONFIG_DEFAULT = {'x-max-priority': None,'no_ack':False} # x-max-priority 是 rabbitmq的优先级队列配置,必须为整数,强烈建议要小于5。为None就代表队列不支持优先级。
18
18
 
19
19
  def _shedual_task(self):
20
20
  # noinspection PyTypeChecker
@@ -28,16 +28,17 @@ class RabbitmqConsumerAmqpStorm(AbstractConsumer):
28
28
  broker_exclusive_config=self.consumer_params.broker_exclusive_config))
29
29
  rp.init_broker()
30
30
  rp.channel_wrapper_by_ampqstormbaic.qos(self.consumer_params.concurrent_num)
31
- rp.channel_wrapper_by_ampqstormbaic.consume(callback=callback, queue=self.queue_name, no_ack=False,
31
+ rp.channel_wrapper_by_ampqstormbaic.consume(callback=callback, queue=self.queue_name, no_ack=self.consumer_params.broker_exclusive_config['no_ack'],
32
32
  )
33
33
  rp.channel.start_consuming(auto_decode=True)
34
34
 
35
35
  def _confirm_consume(self, kw):
36
36
  # noinspection PyBroadException
37
- try:
38
- kw['amqpstorm_message'].ack() # 确认消费
39
- except BaseException as e:
40
- self.logger.error(f'AmqpStorm确认消费失败 {type(e)} {e}')
37
+ if self.consumer_params.broker_exclusive_config['no_ack'] is False:
38
+ try:
39
+ kw['amqpstorm_message'].ack() # 确认消费
40
+ except BaseException as e:
41
+ self.logger.error(f'AmqpStorm确认消费失败 {type(e)} {e}')
41
42
 
42
43
  def _requeue(self, kw):
43
44
  # amqpstorm.Message.delivery_tag
funboost/core/booster.py CHANGED
@@ -206,7 +206,7 @@ class Booster:
206
206
  fabric_deploy(self, **params)
207
207
 
208
208
 
209
- boost = Booster
209
+ boost = Booster # @boost 后消费函数. 不能自动补全方法就用 Booster就可以。 2024版本的 pycharm抽风了,@boost的消费函数不能自动补全提示 .consume .push 这些方法。
210
210
  task_deco = boost # 两个装饰器名字都可以。task_deco是原来名字,兼容一下。
211
211
 
212
212
 
@@ -4,6 +4,7 @@ import functools
4
4
  import json
5
5
  import logging
6
6
  import typing
7
+ from typing_extensions import Literal
7
8
  from collections import OrderedDict
8
9
 
9
10
  from funboost.concurrent_pool import FunboostBaseConcurrentPool, FlexibleThreadPool, ConcurrentPoolBuilder
@@ -98,14 +99,14 @@ class FunctionResultStatusPersistanceConfig(BaseJsonAbleModel):
98
99
  expire_seconds: int = 7 * 24 * 3600 # mongo中的函数运行状态保存多久时间,自动过期
99
100
  is_use_bulk_insert: bool = False # 是否使用批量插入来保存结果,批量插入是每隔0.5秒钟保存一次最近0.5秒内的所有的函数消费状态结果,始终会出现最后0.5秒内的执行结果没及时插入mongo。为False则,每完成一次函数就实时写入一次到mongo。
100
101
 
101
- @validator('expire_seconds')
102
+ @validator('expire_seconds',allow_reuse=True)
102
103
  def check_expire_seconds(cls, value):
103
104
  if value > 10 * 24 * 3600:
104
105
  from funboost.core.loggers import flogger # 这个文件不要提前导入日志,以免互相导入.
105
106
  flogger.warning(f'你设置的过期时间为 {value} ,设置的时间过长。 ')
106
107
  return value
107
108
 
108
- @root_validator(skip_on_failure=True)
109
+ @root_validator(skip_on_failure=True,allow_reuse=True)
109
110
  def cehck_values(cls, values: dict):
110
111
  if not values['is_save_status'] and values['is_save_result']:
111
112
  raise ValueError(f'你设置的是不保存函数运行状态但保存函数运行结果。不允许你这么设置')
@@ -174,7 +175,7 @@ class BoosterParams(BaseJsonAbleModel):
174
175
  is_using_rpc_mode: bool = False # 是否使用rpc模式,可以在发布端获取消费端的结果回调,但消耗一定性能,使用async_result.result时候会等待阻塞住当前线程。
175
176
  rpc_result_expire_seconds: int = 600 # 保存rpc结果的过期时间.
176
177
 
177
- delay_task_apscheduler_jobstores_kind :typing.Literal[ 'redis', 'memory'] = 'redis' # 延时任务的aspcheduler对象使用哪种jobstores ,可以为 redis memory 两种作为jobstore
178
+ delay_task_apscheduler_jobstores_kind :Literal[ 'redis', 'memory'] = 'redis' # 延时任务的aspcheduler对象使用哪种jobstores ,可以为 redis memory 两种作为jobstore
178
179
 
179
180
  is_support_remote_kill_task: bool = False # 是否支持远程任务杀死功能,如果任务数量少,单个任务耗时长,确实需要远程发送命令来杀死正在运行的函数,才设置为true,否则不建议开启此功能。(是把函数放在单独的线程中实现的,随时准备线程被远程命令杀死,所以性能会降低)
180
181
 
@@ -8,6 +8,7 @@ import importlib
8
8
  import pickle
9
9
 
10
10
  import time
11
+ from funboost.utils.decorators import RedisDistributedLockContextManager
11
12
  from typing import Union
12
13
  import threading
13
14
 
@@ -15,7 +16,7 @@ from apscheduler.schedulers.background import BackgroundScheduler
15
16
  from apscheduler.jobstores.redis import RedisJobStore
16
17
  # noinspection PyProtectedMember
17
18
  from apscheduler.schedulers.base import STATE_STOPPED, STATE_RUNNING
18
- from apscheduler.util import undefined
19
+ from apscheduler.util import undefined,TIMEOUT_MAX
19
20
  import deprecated
20
21
  from funboost.utils.redis_manager import RedisMixin
21
22
 
@@ -60,6 +61,9 @@ class FunboostBackgroundScheduler(BackgroundScheduler):
60
61
  通过重写 _main_loop ,使得动态修改增加删除定时任务配置更好。
61
62
  """
62
63
 
64
+ _last_wait_seconds = None
65
+ _last_has_task = False
66
+
63
67
  @deprecated.deprecated(reason='以后不要再使用这种方式,对于job_store为数据库时候需要序列化不好。使用内存和数据库都兼容的添加任务方式: add_push_job')
64
68
  def add_timing_publish_job(self, func, trigger=None, args=None, kwargs=None, id=None, name=None,
65
69
  misfire_grace_time=undefined, coalesce=undefined, max_instances=undefined,
@@ -146,15 +150,39 @@ class FunboostBackgroundScheduler(BackgroundScheduler):
146
150
  或者下一个需要运行的任务的wait_seconds是3600秒后,此时新加了一个动态任务需要3600秒后,
147
151
  现在最多只需要1秒就能扫描到动态新增的定时任务了。
148
152
  """
149
- MAX_WAIT_SECONDS_FOR_NEX_PROCESS_JOBS = 1
153
+ MAX_WAIT_SECONDS_FOR_NEX_PROCESS_JOBS = 1.5
150
154
  wait_seconds = None
151
155
  while self.state == STATE_RUNNING:
152
156
  if wait_seconds is None:
153
157
  wait_seconds = MAX_WAIT_SECONDS_FOR_NEX_PROCESS_JOBS
154
- time.sleep(min(wait_seconds, MAX_WAIT_SECONDS_FOR_NEX_PROCESS_JOBS)) # 这个要取最小值,不然例如定时间隔0.1秒运行,不取最小值,不会每隔0.1秒运行。
158
+ self._last_wait_seconds = min(wait_seconds, MAX_WAIT_SECONDS_FOR_NEX_PROCESS_JOBS)
159
+ if wait_seconds in (None,TIMEOUT_MAX):
160
+ self._last_has_task = False
161
+ else:
162
+ self._last_has_task = True
163
+ time.sleep(self._last_wait_seconds) # 这个要取最小值,不然例如定时间隔0.1秒运行,不取最小值,不会每隔0.1秒运行。
155
164
  wait_seconds = self._process_jobs()
156
165
 
157
166
 
167
+ class FunboostBackgroundSchedulerProcessJobsWithinRedisLock(FunboostBackgroundScheduler):
168
+ process_jobs_redis_lock_key = f'funboost.BackgroundSchedulerProcessJobsWithinRedisLock'
169
+
170
+ def set_process_jobs_redis_lock_key(self,lock_key):
171
+ self.process_jobs_redis_lock_key = lock_key
172
+
173
+ def _process_jobs(self):
174
+ for i in range(10) :
175
+ with RedisDistributedLockContextManager(RedisMixin().redis_db_frame, self.process_jobs_redis_lock_key, ) as lock:
176
+ if lock.has_aquire_lock:
177
+ wait_seconds = super()._process_jobs()
178
+ return wait_seconds
179
+ else:
180
+ time.sleep(0.1)
181
+ return 0.1
182
+
183
+
184
+
185
+
158
186
  FsdfBackgroundScheduler = FunboostBackgroundScheduler # 兼容一下名字,fsdf是 function-scheduling-distributed-framework 老框架名字的缩写
159
187
  # funboost_aps_scheduler定时配置基于内存的,不可以跨机器远程动态添加/修改/删除定时任务配置。如果需要动态增删改查定时任务,可以使用funboost_background_scheduler_redis_store
160
188
 
@@ -6,4 +6,5 @@ from funboost.timing_job import FsdfBackgroundScheduler
6
6
 
7
7
  """
8
8
  这个是使用mysql作为定时任务持久化,支持动态修改 添加定时任务,用户完全可以自己按照 funboost/timing_job/apscheduler_use_redis_store.py 中的代码实现,因为apscheduler支持SQLAlchemyJobStore
9
+ 只是scheduler改个jobstores类型,和funboost知识毫无关系,是apscheduler的知识。
9
10
  """
@@ -2,7 +2,7 @@ from apscheduler.jobstores.redis import RedisJobStore
2
2
 
3
3
  from funboost.funboost_config_deafult import BrokerConnConfig,FunboostCommonConfig
4
4
 
5
- from funboost.timing_job import FunboostBackgroundScheduler
5
+ from funboost.timing_job import FunboostBackgroundSchedulerProcessJobsWithinRedisLock
6
6
 
7
7
  """
8
8
  这个是使用redis作为定时任务持久化,支持动态修改/添加/删除定时任务
@@ -14,7 +14,7 @@ jobstores = {
14
14
  username=BrokerConnConfig.REDIS_USERNAME,jobs_key='funboost.apscheduler.jobs')
15
15
  }
16
16
 
17
- funboost_background_scheduler_redis_store = FunboostBackgroundScheduler(timezone=FunboostCommonConfig.TIMEZONE, daemon=False, jobstores=jobstores)
17
+ funboost_background_scheduler_redis_store = FunboostBackgroundSchedulerProcessJobsWithinRedisLock(timezone=FunboostCommonConfig.TIMEZONE, daemon=False, jobstores=jobstores)
18
18
 
19
19
 
20
20
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: funboost
3
- Version: 46.5
3
+ Version: 46.7
4
4
  Summary: pip install funboost,python全功能分布式函数调度框架,funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚
5
5
  Home-page: https://github.com/ydf0509/funboost
6
6
  Author: bfzs
@@ -1,4 +1,4 @@
1
- funboost/__init__.py,sha256=ZAFXiSXRHlDxBnIZYs0zDfvkmRlw0KzxCa-DOk15kr8,3956
1
+ funboost/__init__.py,sha256=4AscHUBU9yAh_IbFd_y1pbOT34_ltO5-u-B6-IO1aHo,3956
2
2
  funboost/__init__old.py,sha256=9Kv3cPLnPkbzMRnuJFVkPsuDdx1CdcSIuITkpdncZSc,20382
3
3
  funboost/__main__.py,sha256=-6Nogi666Y0LN8fVm3JmHGTOk8xEGWvotW_GDbSaZME,1065
4
4
  funboost/constant.py,sha256=STzRDZbuCC5FFV-uD_0r2beGsD1Zni4kregzR11z3Ok,8148
@@ -35,7 +35,7 @@ funboost/concurrent_pool/backup/async_pool_executor0223.py,sha256=RVUZiylUvpTm6U
35
35
  funboost/concurrent_pool/backup/async_pool_executor_back.py,sha256=KL6zEQaa1KkZOlAO85mCC1gwLm-YC5Ghn21IUom0UKM,9598
36
36
  funboost/concurrent_pool/backup/async_pool_executor_janus.py,sha256=OHMWJ9l3EYTpPpcrPrGGKd4K0tmQ2PN8HiX0Dta0EOo,5728
37
37
  funboost/consumers/__init__.py,sha256=ZXY_6Kut1VYNQiF5aWEgIWobsW1ht9YUP0TdRZRWFqI,126
38
- funboost/consumers/base_consumer.py,sha256=giup7qf1WFhkMVfVVCkmeF560bArHGWFRNzjxgZQhYE,81599
38
+ funboost/consumers/base_consumer.py,sha256=nbW-xB1o-GWqO8pe8T1MHISLDFlxe8rcfT6c0571GLY,82220
39
39
  funboost/consumers/celery_consumer.py,sha256=nQpSkzPBJ4bRpxn4i9ms0axrJiq9RWhb4lG2nAdCIig,9254
40
40
  funboost/consumers/confirm_mixin.py,sha256=5xC9AAQr_MY4tbSed8U-M6tOVmh69Qv9X0ld0JLT9Tk,6185
41
41
  funboost/consumers/dramatiq_consumer.py,sha256=ozmeAfeF0U-YNYHK4suQB0N264h5AZdfMH0O45Mh-8A,2229
@@ -58,7 +58,7 @@ funboost/consumers/nsq_consumer.py,sha256=KcP4wT656LyvuwyQXnVp0B6DwYvnZ6z_Vyzt0K
58
58
  funboost/consumers/peewee_conusmer.py,sha256=VqbSu9AdKO4_wgu0XhTWRO3VeWctecbbz2X_V04_kXw,1115
59
59
  funboost/consumers/persist_queue_consumer.py,sha256=PUfelfW84YiqcsbcIAveWMC50rw2DScZ3u_aiaS0Kk8,1015
60
60
  funboost/consumers/pulsar_consumer.py,sha256=eorN61kCvP3yg4fNAB3ZCfqpJJxPnAN6PJY48uiYX5Y,2385
61
- funboost/consumers/rabbitmq_amqpstorm_consumer.py,sha256=r6pQP14c9-D1Bn2hc5hHoHqHOgWJaB2itiemEhz4iIM,2214
61
+ funboost/consumers/rabbitmq_amqpstorm_consumer.py,sha256=zcSX16cw087MgnrHsiZibNUzIZRKfGBtVVnhnYyYku0,2371
62
62
  funboost/consumers/rabbitmq_pika_consumer.py,sha256=51IkRUSR0v2v7BUlA8oInx81VGeO5OaD2pk0UXHdY78,5408
63
63
  funboost/consumers/rabbitmq_pika_consumerv0.py,sha256=rIQToBTBqGdjnzMhg0vyZMY87NtK_Uw8ggiTu39JQ_w,4777
64
64
  funboost/consumers/rabbitmq_rabbitpy_consumer.py,sha256=xxINY037pmgF3_lJA-zhf9qUIUx6DdqC7tsUOQL3dL4,1330
@@ -86,13 +86,13 @@ funboost/contrib/redis_consume_latest_msg_broker.py,sha256=ESortBZ2qu_4PBCa3e3Fe
86
86
  funboost/contrib/save_result_status_to_sqldb.py,sha256=AxvD7nHs4sjr9U0kwEZzyPKrsGdU_JzEgzzhh_V1_4w,4071
87
87
  funboost/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
88
  funboost/core/active_cousumer_info_getter.py,sha256=09fEc-BTEIRfDDfHmOvKnMjLjtOyp4edLsUlAXUR_Qs,4966
89
- funboost/core/booster.py,sha256=OMsHR-WK23aihmLF-gJ78ELMkYhYH76Ll7y-v8C1Ivo,18847
89
+ funboost/core/booster.py,sha256=xxuDTCb3WrjTzEqfGSPMIz-JYtFIpKJPj9uscupCrgs,19038
90
90
  funboost/core/current_task.py,sha256=Oils18_vAqGvV4pqM6yYwnhMaFn3nrpzo1PO48HHidQ,5799
91
91
  funboost/core/exceptions.py,sha256=pLF7BkRJAfDiWp2_xGZqencmwdPiSQI1NENbImExknY,1311
92
92
  funboost/core/fabric_deploy_helper.py,sha256=foieeqlNySuU9axJzNF6TavPjIUSYBx9UO3syVKUiyY,9999
93
93
  funboost/core/funboost_config_getter.py,sha256=b5nAdAmUxahskY-ohB7ptf2gKywFlDA0Fq1cWroxxbs,384
94
94
  funboost/core/funboost_time.py,sha256=IbB4dFCpg3oGUe90ssAJ_x0eDPtAVfvsUr4esdoKaOk,1777
95
- funboost/core/func_params_model.py,sha256=amuHVITwDT037P9Q7KUGvmZljNZwwGZ7LTnunEvnvII,21534
95
+ funboost/core/func_params_model.py,sha256=QPfuO4ngVE5nep7-RnBBgyxA5YzLkWNqqHhz7B6AM7M,21600
96
96
  funboost/core/function_result_status_config.py,sha256=PyjqAQOiwsLt28sRtH-eYRjiI3edPFO4Nde0ILFRReE,1764
97
97
  funboost/core/function_result_status_saver.py,sha256=yHKZF9MjmhI-Q4Mkrka7DdweJ0wpgfLmgfAlsfkCeCk,9274
98
98
  funboost/core/helper_funs.py,sha256=SsMa7A3iJyLek6v1qRK02kINebDp6kuAmlYkrYLXwQ0,2369
@@ -172,9 +172,9 @@ funboost/queues/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
172
172
  funboost/queues/memory_queues_map.py,sha256=e1S_cnjnCVI4DBsA_iupF51S_eX4OvCtlefQCqS1TYA,424
173
173
  funboost/queues/peewee_queue.py,sha256=FrwegrilkHZG6Y1cGdl5Bt_UtA25f7m5TJQJMZ9YnJI,5280
174
174
  funboost/queues/sqla_queue.py,sha256=b-2QPvvuMxklm41ibZhGKehaAV9trXBQFCOHzgThx_s,11080
175
- funboost/timing_job/__init__.py,sha256=uMKIiZOqr8aXGPxZhDcVVeeNTsDi-S7kOkLc1nHaLQw,9099
176
- funboost/timing_job/apscheduler_use_mysql_store.py,sha256=VoDtjdICIL99s3LdE1aaFvGFNZ27vtDWD3jj4X_SEio,372
177
- funboost/timing_job/apscheduler_use_redis_store.py,sha256=l54J40oe0FYDJoKtUdEfoP0yum_FmupNrJS1rNKbW7o,991
175
+ funboost/timing_job/__init__.py,sha256=gZIfFUn0ZLfZX6GUR3vycIJEzf3hURWWd5G57JkaVi8,10187
176
+ funboost/timing_job/apscheduler_use_mysql_store.py,sha256=ss92DiSLzbWuVIo19sTLgC99GessltWLOlqqOd4AIL4,471
177
+ funboost/timing_job/apscheduler_use_redis_store.py,sha256=RspecIM8tTzcAfoS-HG9mOgUsJshvqq70hfm0_NKx3s,1043
178
178
  funboost/utils/__init__.py,sha256=rAyXE7lgCo_3VdMvGrIJiqsTHv2nZPTJDTj1f6s_KgE,586
179
179
  funboost/utils/apscheduler_monkey.py,sha256=CcUISbqX6nMWSxr_QjZ26IvvhUk_ojYZWRaKenpsKfE,3124
180
180
  funboost/utils/block_exit.py,sha256=BnfxNYo3lnmhk686RAEoc4u3D4RU_iEMMMgu5L8gIuI,96
@@ -277,9 +277,9 @@ funboost/utils/pysnooper_ydf/utils.py,sha256=evSmGi_Oul7vSP47AJ0DLjFwoCYCfunJZ1m
277
277
  funboost/utils/pysnooper_ydf/variables.py,sha256=QejRDESBA06KG9OH4sBT4J1M55eaU29EIHg8K_igaXo,3693
278
278
  funboost/utils/times/__init__.py,sha256=Y4bQD3SIA_E7W2YvHq2Qdi0dGM4H2DxyFNdDOuFOq1w,2417
279
279
  funboost/utils/times/version.py,sha256=11XfnZVVzOgIhXXdeN_mYfdXThfrsbQHpA0wCjz-hpg,17
280
- funboost-46.5.dist-info/LICENSE,sha256=9EPP2ktG_lAPB8PjmWV-c9BiaJHc_FP6pPLcUrUwx0E,11562
281
- funboost-46.5.dist-info/METADATA,sha256=SVj-dcGlnzd0vRpyZD_u4iB1Lu1e38MoYi5xJ7mltoE,32849
282
- funboost-46.5.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
283
- funboost-46.5.dist-info/entry_points.txt,sha256=BQMqRALuw-QT9x2d7puWaUHriXfy3wIzvfzF61AnSSI,97
284
- funboost-46.5.dist-info/top_level.txt,sha256=K8WuKnS6MRcEWxP1NvbmCeujJq6TEfbsB150YROlRw0,9
285
- funboost-46.5.dist-info/RECORD,,
280
+ funboost-46.7.dist-info/LICENSE,sha256=9EPP2ktG_lAPB8PjmWV-c9BiaJHc_FP6pPLcUrUwx0E,11562
281
+ funboost-46.7.dist-info/METADATA,sha256=5Iw6_m1gcjBO2vvl2jS-kfO1Vhy9bAY-qVmOkkNynl8,32849
282
+ funboost-46.7.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
283
+ funboost-46.7.dist-info/entry_points.txt,sha256=BQMqRALuw-QT9x2d7puWaUHriXfy3wIzvfzF61AnSSI,97
284
+ funboost-46.7.dist-info/top_level.txt,sha256=K8WuKnS6MRcEWxP1NvbmCeujJq6TEfbsB150YROlRw0,9
285
+ funboost-46.7.dist-info/RECORD,,