first commit
This commit is contained in:
@@ -0,0 +1,237 @@
|
||||
from typing import Dict, List, Callable, Any
|
||||
from fastapi import BackgroundTasks
|
||||
|
||||
import asyncio
|
||||
import logging
|
||||
from enum import Enum
|
||||
import time
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class EventPriority(Enum):
|
||||
HIGH = 1
|
||||
MEDIUM = 2
|
||||
LOW = 3
|
||||
|
||||
class EventType:
|
||||
# 同步星云联系人信息
|
||||
SYNC_XINGYUN_CONTACT_INFO = "sync_xingyun_contact_info"
|
||||
# 绑定订单给用户
|
||||
BIND_ORDER_FOR_USER = "bind_order_for_user"
|
||||
# 打开个人聊天会话
|
||||
OPEN_PERSONAL_CHAT = "open_personal_chat"
|
||||
# 群聊变更
|
||||
GROUP_CHAT_UPDATED = "group_chat_updated"
|
||||
# 检查创建群聊
|
||||
CHECK_CREATE_GROUP_CHAT = "check_create_group_chat"
|
||||
# 客服领单
|
||||
CUSTOMER_SERVICE_ASSIGN_ORDER = "customer_service_assign_order"
|
||||
# 分配设计师
|
||||
DESIGNER_ASSIGN_ORDER = "designer_assign_order"
|
||||
# 客户复购
|
||||
OLD_CUSTOMER_REPEAT_PURCHASE = "old_customer_repeat_purchase"
|
||||
# 客户退货
|
||||
CUSTOMER_RETURN_ORDER = "customer_return_order"
|
||||
# 设计稿上传
|
||||
DESIGNER_UPLOAD_DESIGN = "designer_upload_design"
|
||||
# 客户在新店铺下单
|
||||
CUSTOMER_ORDER_IN_NEW_SHOP = "customer_order_in_new_shop"
|
||||
|
||||
|
||||
EventList = [
|
||||
{
|
||||
"value": EventType.SYNC_XINGYUN_CONTACT_INFO,
|
||||
"label": "同步星云联系人信息",
|
||||
"description": "当星云联系人信息发生变化时触发",
|
||||
"automation_event": False
|
||||
},
|
||||
{
|
||||
"value": EventType.BIND_ORDER_FOR_USER,
|
||||
"label": "绑定订单",
|
||||
"description": "当用户创建订单时触发",
|
||||
"automation_event": True
|
||||
},
|
||||
{
|
||||
"value": EventType.OPEN_PERSONAL_CHAT,
|
||||
"label": "打开个人聊天会话",
|
||||
"description": "当用户创建个人聊天时触发",
|
||||
"automation_event": False
|
||||
},
|
||||
{
|
||||
"value": EventType.GROUP_CHAT_UPDATED,
|
||||
"label": "群聊变更",
|
||||
"description": "当群聊信息发生变化时触发",
|
||||
"automation_event": True
|
||||
},
|
||||
{
|
||||
"value": EventType.CHECK_CREATE_GROUP_CHAT,
|
||||
"label": "群聊创建",
|
||||
"description": "当用户请求创建群聊时触发",
|
||||
"automation_event": True
|
||||
},
|
||||
{
|
||||
"value": EventType.CUSTOMER_SERVICE_ASSIGN_ORDER,
|
||||
"label": "客服领单",
|
||||
"description": "当客服领单时触发",
|
||||
"automation_event": True
|
||||
},
|
||||
{
|
||||
"value": EventType.DESIGNER_ASSIGN_ORDER,
|
||||
"label": "分配设计师",
|
||||
"description": "当分配设计师时触发",
|
||||
"automation_event": True
|
||||
},
|
||||
{
|
||||
"value": EventType.OLD_CUSTOMER_REPEAT_PURCHASE,
|
||||
"label": "客户复购",
|
||||
"description": "当老客复购时触发",
|
||||
"automation_event": True
|
||||
},
|
||||
{
|
||||
"value": EventType.CUSTOMER_RETURN_ORDER,
|
||||
"label": "客户退货",
|
||||
"description": "当客户退货时触发",
|
||||
"automation_event": True
|
||||
},
|
||||
{
|
||||
"value": EventType.DESIGNER_UPLOAD_DESIGN,
|
||||
"label": "设计稿上传",
|
||||
"description": "当设计师上传设计稿时触发",
|
||||
"automation_event": True
|
||||
},
|
||||
{
|
||||
"value": EventType.CUSTOMER_ORDER_IN_NEW_SHOP,
|
||||
"label": "客户在新店铺下单",
|
||||
"description": "当客户在新店铺下单时触发",
|
||||
"automation_event": True
|
||||
},
|
||||
]
|
||||
|
||||
class NonBlockingEventManager:
|
||||
def __init__(self):
|
||||
self.handlers: Dict[str, List[Callable]] = {}
|
||||
self.priority_handlers: Dict[EventPriority, List[Callable]] = {
|
||||
EventPriority.HIGH: [],
|
||||
EventPriority.MEDIUM: [],
|
||||
EventPriority.LOW: []
|
||||
}
|
||||
self.pretasks: List[Callable] = []
|
||||
self.automation_event_handlers: Dict[str, Any] = []
|
||||
|
||||
def subscribe(self, event_type: str, handler: Callable, priority: EventPriority = EventPriority.MEDIUM, input_model: Any = None):
|
||||
if event_type not in self.handlers:
|
||||
self.handlers[event_type] = []
|
||||
|
||||
for event in EventList:
|
||||
if event["value"] == event_type:
|
||||
event["field_tree"] = input_model
|
||||
self.automation_event_handlers.append(event)
|
||||
|
||||
logger.info(f"Subscribe {event_type} with priority {priority}")
|
||||
# print(f"Subscribe {event_type} with priority {priority}", flush=True)
|
||||
self.handlers[event_type].append(handler)
|
||||
|
||||
def subscribe_priority(self, handler: Callable, priority: EventPriority = EventPriority.MEDIUM):
|
||||
"""订阅所有事件类型的处理器,按优先级"""
|
||||
self.priority_handlers[priority].append(handler)
|
||||
|
||||
async def publish_async(self, event_type: str, data: Any, background_tasks: BackgroundTasks):
|
||||
"""异步发布事件,不阻塞主线程"""
|
||||
# 添加到后台任务,立即返回
|
||||
background_tasks.add_task(
|
||||
self._process_event_async,
|
||||
event_type,
|
||||
data
|
||||
)
|
||||
|
||||
def register_pretask(self, pretask: Callable):
|
||||
"""注册预任务"""
|
||||
self.pretasks.append(pretask)
|
||||
|
||||
async def trigger_event(self, event_type: str, event_data: Any):
|
||||
"""解析事件数据"""
|
||||
for pretask in self.pretasks:
|
||||
await pretask(event_type, event_data)
|
||||
|
||||
async def _process_event_async(self, event_type: str, data: Any):
|
||||
"""异步处理事件"""
|
||||
start_time = time.time()
|
||||
|
||||
# 触发事件系统
|
||||
try:
|
||||
await self.trigger_event(event_type, data)
|
||||
except Exception as e:
|
||||
logger.exception(f'处理事件失败,{e}')
|
||||
|
||||
# 处理优先级处理器(高优先级先执行)
|
||||
for priority in [EventPriority.HIGH, EventPriority.MEDIUM, EventPriority.LOW]:
|
||||
priority_tasks = []
|
||||
for handler in self.priority_handlers[priority]:
|
||||
try:
|
||||
if asyncio.iscoroutinefunction(handler):
|
||||
task = handler(event_type, data)
|
||||
else:
|
||||
task = asyncio.to_thread(handler, event_type, data)
|
||||
priority_tasks.append(task)
|
||||
except Exception as e:
|
||||
logger.error(f"Error in priority handler: {e}")
|
||||
|
||||
if priority_tasks:
|
||||
await asyncio.gather(*priority_tasks, return_exceptions=True)
|
||||
|
||||
# 处理特定事件类型的处理器
|
||||
if event_type in self.handlers:
|
||||
specific_tasks = []
|
||||
for handler in self.handlers[event_type]:
|
||||
try:
|
||||
if asyncio.iscoroutinefunction(handler):
|
||||
task = handler(event_type, data)
|
||||
else:
|
||||
task = asyncio.to_thread(handler, event_type, data)
|
||||
specific_tasks.append(task)
|
||||
except Exception as e:
|
||||
logging.error(f"Error in specific handler: {e}")
|
||||
|
||||
if specific_tasks:
|
||||
await asyncio.gather(*specific_tasks, return_exceptions=True)
|
||||
|
||||
logging.info(f"Event {event_type} processed in {time.time() - start_time:.2f}s")
|
||||
|
||||
# 创建全局事件管理器
|
||||
event_manager = NonBlockingEventManager()
|
||||
|
||||
# # 定义事件处理器
|
||||
# async def log_event_handler(event_type: str, data: Any):
|
||||
# await asyncio.sleep(0.1) # 模拟异步日志记录
|
||||
# logging.info(f"Logged event: {event_type}")
|
||||
|
||||
# def update_cache_handler( Any):
|
||||
# import time
|
||||
# time.sleep(0.5) # 模拟缓存更新
|
||||
# logging.info(f"Cache updated with: {data}")
|
||||
|
||||
# # 注册处理器
|
||||
# event_manager.subscribe_priority(log_event_handler, EventPriority.HIGH)
|
||||
# event_manager.subscribe("order_created", update_cache_handler, EventPriority.MEDIUM)
|
||||
|
||||
# @app.post("/orders")
|
||||
# async def create_order_complete(order_ dict, background_tasks: BackgroundTasks):
|
||||
# # 执行主要业务逻辑
|
||||
# order_id = f"order_{hash(str(order_data))}"
|
||||
# order_data["order_id"] = order_id
|
||||
|
||||
# # 保存到数据库
|
||||
# # await save_order_to_db(order_data)
|
||||
|
||||
# # 立即返回响应
|
||||
# response = {"order_id": order_id, "status": "created"}
|
||||
|
||||
# # 异步发布事件,不阻塞响应
|
||||
# await event_manager.publish_async("order_created", order_data, background_tasks)
|
||||
|
||||
# return response
|
||||
|
||||
# # 启动时配置
|
||||
# @app.on_event("startup")
|
||||
# async def startup_event():
|
||||
# logging.basicConfig(level=logging.INFO)
|
||||
Reference in New Issue
Block a user