Skip to content

Commit a1742c9

Browse files
author
LAPTOP-7V78BBO2\ydf19
committed
1
1 parent f103008 commit a1742c9

File tree

14 files changed

+26479
-678
lines changed

14 files changed

+26479
-678
lines changed

.qoder/rules/r1.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
trigger: always_on
3+
alwaysApply: true
4+
---
5+
6+
1. 我的操作系统是win,别用linux命令执行
7+
2. 如果你要生成临时的测试验证代码,请生成到 tests/ai_gen 这个目录下

.qoderignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Specify files or folders to ignore during indexing. Use commas to separate entries. Glob patterns like *.log,my-security/ are supported.

README.md

Lines changed: 145 additions & 187 deletions
Large diffs are not rendered by default.

funboost/consumers/base_consumer.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -491,14 +491,14 @@ def _user_convert_msg_before_run(self, msg: typing.Union[str, dict]) -> dict:
491491
return msg
492492

493493
def _submit_task(self, kw):
494-
495494
kw['body'] = self._convert_msg_before_run(kw['body'])
496495
self._print_message_get_from_broker(kw['body'])
497496
if self._judge_is_daylight():
498497
self._requeue(kw)
499498
time.sleep(self.time_interval_for_check_do_not_run_time)
500499
return
501500
function_only_params = delete_keys_and_return_new_dict(kw['body'], )
501+
kw['function_only_params'] = function_only_params
502502
if self._get_priority_conf(kw, 'do_task_filtering') and self._redis_filter.check_value_exists(
503503
function_only_params,self._get_priority_conf(kw, 'filter_str')): # 对函数的参数进行检查,过滤已经执行过并且成功的任务。
504504
self.logger.warning(f'redis的 [{self._redis_filter_key_name}] 键 中 过滤任务 {kw["body"]}')
@@ -688,7 +688,7 @@ def _run(self, kw: dict, ):
688688
max_retry_times = self._get_priority_conf(kw, 'max_retry_times')
689689
current_function_result_status = FunctionResultStatus(self.queue_name, self.consuming_function.__name__, kw['body'], )
690690
current_retry_times = 0
691-
function_only_params = delete_keys_and_return_new_dict(kw['body'])
691+
function_only_params = kw['function_only_params']
692692
for current_retry_times in range(max_retry_times + 1):
693693
current_function_result_status.run_times = current_retry_times + 1
694694
current_function_result_status.run_status = RunStatus.running
@@ -747,10 +747,10 @@ def _run(self, kw: dict, ):
747747
# noinspection PyProtectedMember
748748
def _run_consuming_function_with_confirm_and_retry(self, kw: dict, current_retry_times,
749749
function_result_status: FunctionResultStatus, ):
750-
function_only_params = delete_keys_and_return_new_dict(kw['body']) if self._do_not_delete_extra_from_msg is False else kw['body']
750+
function_only_params = kw['function_only_params'] if self._do_not_delete_extra_from_msg is False else kw['body']
751751
task_id = kw['body']['extra']['task_id']
752752
t_start = time.time()
753-
# function_result_status.run_times = current_retry_times + 1
753+
754754
fct = funboost_current_task()
755755
fct_context = FctContext(function_params=function_only_params,
756756
full_msg=kw['body'],
@@ -872,7 +872,7 @@ def _unified_run(self, kw, is_async):
872872
max_retry_times = self._get_priority_conf(kw, 'max_retry_times')
873873
current_function_result_status = FunctionResultStatus(self.queue_name, self.consuming_function.__name__, kw['body'], )
874874
current_retry_times = 0
875-
function_only_params = delete_keys_and_return_new_dict(kw['body'])
875+
function_only_params = kw['function_only_params']
876876
for current_retry_times in range(max_retry_times + 1):
877877
current_function_result_status.run_times = current_retry_times + 1
878878
current_function_result_status.run_status = RunStatus.running
@@ -936,8 +936,8 @@ async def _async_run_consuming_function_with_confirm_and_retry(self, kw: dict, c
936936
function_result_status: FunctionResultStatus, ):
937937
"""虽然和上面有点大面积重复相似,这个是为了asyncio模式的,asyncio模式真的和普通同步模式的代码思维和形式区别太大,
938938
框架实现兼容async的消费函数很麻烦复杂,连并发池都要单独写"""
939-
function_only_params = delete_keys_and_return_new_dict(kw['body']) if self._do_not_delete_extra_from_msg is False else kw['body']
940-
function_result_status.run_times = current_retry_times + 1
939+
function_only_params = kw['function_only_params'] if self._do_not_delete_extra_from_msg is False else kw['body']
940+
941941
# noinspection PyBroadException
942942
t_start = time.time()
943943
fct = funboost_current_task()

funboost/core/funboost_time.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import pytz
22
import time
3-
3+
import sys
44
import datetime
55

66
import typing
@@ -28,6 +28,46 @@ def get_str_fast(self):
2828
return t_str
2929

3030

31+
32+
33+
# 缓存时区对象,提升性能(避免重复解析)
34+
_tz_cache = {}
35+
36+
def get_now_time_str_by_tz(tz_name: str=None) -> str:
37+
"""
38+
根据时区名(如 'Asia/Shanghai')返回当前时间字符串,格式:'%Y-%m-%d %H:%M:%S'
39+
40+
兼容 Python 3.6+,优先使用 zoneinfo(3.9+),否则尝试 pytz
41+
42+
:param tz_name: IANA 时区名称,如 'Asia/Shanghai', 'America/New_York'
43+
:return: 格式化时间字符串
44+
"""
45+
# 检查缓存
46+
tz_name = tz_name or FunboostCommonConfig.TIMEZONE
47+
if tz_name not in _tz_cache:
48+
if sys.version_info >= (3, 9):
49+
from zoneinfo import ZoneInfo
50+
_tz_cache[tz_name] = ZoneInfo(tz_name)
51+
else:
52+
# Python < 3.9,使用 pytz
53+
try:
54+
import pytz
55+
_tz_cache[tz_name] = pytz.timezone(tz_name)
56+
except ImportError:
57+
raise RuntimeError(
58+
f"Python < 3.9 requires 'pytz' to handle timezones. "
59+
f"Install it with: pip install pytz"
60+
) from None
61+
except pytz.UnknownTimeZoneError:
62+
raise pytz.UnknownTimeZoneError(tz_name)
63+
64+
tz = _tz_cache[tz_name]
65+
66+
# 获取当前时间并格式化(注意:datetime.now(tz) 是最高效的方式)
67+
now = datetime.datetime.now(tz)
68+
return f'{now.year:04d}-{now.month:02d}-{now.day:02d} {now.hour:02d}:{now.minute:02d}:{now.second:02d}'
69+
# return now.strftime("%Y-%m-%d %H:%M:%S")
70+
3171
if __name__ == '__main__':
3272
print(FunboostTime().get_str())
3373
tz=pytz.timezone(FunboostCommonConfig.TIMEZONE)

funboost/core/function_result_status_saver.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from pymongo import IndexModel, ReplaceOne
1515

1616
from funboost.core.func_params_model import FunctionResultStatusPersistanceConfig
17-
from funboost.core.helper_funs import get_publish_time, delete_keys_and_return_new_dict
17+
from funboost.core.helper_funs import get_publish_time, delete_keys_and_return_new_dict, get_publish_time_format
1818
from funboost.core.serialization import Serialization
1919
from funboost.utils import time_util, decorators
2020
from funboost.utils.mongo_util import MongoMixin
@@ -42,9 +42,9 @@ def __init__(self, queue_name: str, fucntion_name: str, msg_dict: dict):
4242
self.task_id = self.msg_dict.get('extra', {}).get('task_id', '')
4343
self.process_id = os.getpid()
4444
self.thread_id = threading.get_ident()
45-
self.publish_time = publish_time = get_publish_time(msg_dict)
46-
if publish_time:
47-
self.publish_time_str = time_util.DatetimeConverter(publish_time).datetime_str
45+
self.publish_time = get_publish_time(msg_dict)
46+
self.publish_time_format = get_publish_time_format(msg_dict)
47+
# print(self.publish_time_format)
4848
function_params = delete_keys_and_return_new_dict(msg_dict, )
4949
self.params = function_params
5050
self.params_str = Serialization.to_json_str(function_params)

funboost/core/helper_funs.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import time
44
import uuid
55
import datetime
6-
from funboost.core.funboost_time import FunboostTime
6+
from funboost.core.funboost_time import FunboostTime, get_now_time_str_by_tz
77

88

99
def get_publish_time(paramsx: dict):
@@ -14,6 +14,14 @@ def get_publish_time(paramsx: dict):
1414
return paramsx.get('extra', {}).get('publish_time', None)
1515

1616

17+
def get_publish_time_format(paramsx: dict):
18+
"""
19+
:param paramsx:
20+
:return:
21+
"""
22+
return paramsx.get('extra', {}).get('publish_time_format', None)
23+
24+
1725
def delete_keys_and_return_new_dict(dictx: dict, keys: list = None):
1826
dict_new = copy.deepcopy(dictx) # 主要是去掉一级键 publish_time,浅拷贝即可。新的消息已经不是这样了。
1927
keys = ['publish_time', 'publish_time_format', 'extra'] if keys is None else keys
@@ -49,13 +57,18 @@ def generate_task_id(queue_name:str) -> str:
4957
def generate_publish_time() -> float:
5058
return round(time.time(),4)
5159

60+
# @staticmethod # 性能不好
61+
# def generate_publish_time_format() -> str:
62+
# return FunboostTime().get_str()
63+
5264
@staticmethod
5365
def generate_publish_time_format() -> str:
54-
return FunboostTime().get_str()
66+
return get_now_time_str_by_tz()
5567

5668
@classmethod
5769
def generate_pulish_time_and_task_id(cls,queue_name:str,task_id=None):
58-
extra_params = {'task_id': task_id or cls.generate_task_id(queue_name), 'publish_time': cls.generate_publish_time(),
70+
extra_params = {'task_id': task_id or cls.generate_task_id(queue_name),
71+
'publish_time': cls.generate_publish_time(),
5972
'publish_time_format': cls.generate_publish_time_format()}
6073
return extra_params
6174

0 commit comments

Comments
 (0)