You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

异步定时调用多API执行固定流程可采用的设计模式有哪些?

适配该场景的设计方案

1. 模板方法模式(核心适配)

该模式完全匹配你的场景特性:固定执行步骤、单步骤可独立扩展、整体执行逻辑统一。你当前的单次API调用有请求→提取→保存3个固定执行顺序,刚好符合模板方法的核心设计逻辑:把不变的行为(执行步骤框架、执行顺序)抽离封装到基类,可变的个性化逻辑(不同API的请求参数、提取规则、存储目标)留给子类实现。

参考代码结构示例:

from abc import ABC, abstractmethod

# 抽象基类:定义固定执行模板
class BaseAPIScraper(ABC):
    # 固定执行流程,禁止子类修改
    def run(self):
        resp = self.request()
        target_data = self.extract(resp)
        self.save(target_data)
    
    @abstractmethod
    def request(self):
        """不同API实现自定义请求逻辑(header、参数、签名等)"""
        pass
    
    @abstractmethod
    def extract(self, resp):
        """不同API实现自定义字段提取规则"""
        pass
    
    @abstractmethod
    def save(self, data):
        """不同API实现自定义存储逻辑,通用存储可直接做默认实现"""
        pass

# 每个API单独实现子类,不需要关心执行顺序,只需要补全单步逻辑
class Api1Scraper(BaseAPIScraper):
    def request(self):
        # API1专属请求逻辑
        pass
    def extract(self, resp):
        # API1专属字段提取逻辑
        pass
    def save(self, data):
        # API1专属存储逻辑
        pass

后续新增API只需要新增子类即可,不需要修改原有执行逻辑,符合开闭原则。

2. 搭配策略模式处理异步调度

因为你的3个API调用无顺序要求、异步并行执行,可以把每个API的scraper实例作为独立的执行策略,调度层统一收集所有策略后批量异步触发即可:

import asyncio
# 收集所有需要执行的API策略实例
scraper_strategies = [Api1Scraper(), Api2Scraper(), Api3Scraper()]

async def batch_run():
    # 异步并行执行所有策略的run方法
    tasks = [asyncio.to_thread(s.run) for s in scraper_strategies]
    await asyncio.gather(*tasks)

# 定时调度部分直接每5分钟触发batch_run方法即可

额外优化建议

如果多个API的提取、存储逻辑有通用部分,可以直接在基类实现通用默认逻辑,子类只有特殊需求时再重写对应方法即可,减少重复代码。比如所有API都存储到同一MySQL实例的不同表,那基类的save方法可以封装通用的数据库连接、写入逻辑,子类只需要返回对应表名和格式化后的数据即可。

内容的提问来源于stack exchange,提问作者lightyears99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:15:02