Plugins 在容器中托管简单的python脚本以处理并发、配置、缓存等

Plugins 在容器中托管简单的python脚本以处理并发、配置、缓存等,plugins,dependency-injection,ioc-container,python,Plugins,Dependency Injection,Ioc Container,Python,我的第一个真实Python项目是编写一个简单的框架,或者重用/改编一个现有的框架,该框架可以封装小型Python脚本,用于为监控工具收集自定义数据,并带有一个容器来处理样板任务,如: 从文件中获取脚本配置,并在文件更改时保持该信息最新,并处理敏感配置数据的解密 在不同线程中运行同一脚本的多个实例,而不是为每个实例启动一个新进程 公开用于缓存昂贵数据和存储从一个脚本调用到下一个脚本调用的持久状态的API 现在,脚本作者必须处理上述问题,这通常意味着大多数脚本作者不能正确处理这些问题,从而导致错误和

我的第一个真实Python项目是编写一个简单的框架,或者重用/改编一个现有的框架,该框架可以封装小型Python脚本,用于为监控工具收集自定义数据,并带有一个容器来处理样板任务,如:

从文件中获取脚本配置,并在文件更改时保持该信息最新,并处理敏感配置数据的解密 在不同线程中运行同一脚本的多个实例,而不是为每个实例启动一个新进程 公开用于缓存昂贵数据和存储从一个脚本调用到下一个脚本调用的持久状态的API 现在,脚本作者必须处理上述问题,这通常意味着大多数脚本作者不能正确处理这些问题,从而导致错误和性能问题。除了避免bug之外,我们还需要一种降低创建和维护脚本门槛的解决方案,特别是考虑到许多脚本作者可能不是经过培训的程序员

下面是我一直在思考的API示例,我希望得到您的反馈

脚本编写者需要构建一个方法,该方法将脚本执行其工作所需的配置作为输入,并返回python对象或调用方法以分块流式返回数据。或者,脚本编写者可以提供处理启动和/或关闭任务的方法

伪代码中的HTTP抓取脚本示例,省略了实际的数据抓取详细信息以关注容器的API:

def run (config, context, cache) : 
    results = http_library_call (config.url, config.http_method, config.username, config.password, ...) 
    return { html : results.html, status_code : results.status, headers : results.response_headers }

def init(config, context, cache) : 
     config.max_threads = 20  # up to 20 URLs at one time (per process) 
     config.max_processes = 3  # launch up to 3 concurrent processes 
     config.keepalive = 1200  # keep process alive for 10 mins without another call
     config.process_recycle.requests = 1000  # restart the process every 1000 requests (to avoid leaks) 
     config.kill_timeout = 600  # kill the process if any call lasts longer than 10 minutes 
数据库数据获取脚本示例在伪代码中可能如下所示:

def run (config, context, cache) : 
    expensive = context.cache["something_expensive"] 
    for record in db_library_call (expensive, context.checkpoint, config.connection_string) : 
        context.log (record, "logDate")  # log all properties, optionally specify name of timestamp property 
        last_date = record["logDate"] 
    context.checkpoint = last_date  # persistent checkpoint, used next time through 

def init(config, context, cache) : 
    cache["something_expensive"] = get_expensive_thing() 

def shutdown(config, context, cache) : 
    expensive = cache["something_expensive"] 
    expensive.release_me()
这个API是适合Python的,还是我应该做一些事情来使Python脚本编写者更自然?我更熟悉构建C++/C/JavaAPI,因此我怀疑我缺少有用的Python习惯用法

具体问题:

将配置对象传递给方法并要求被调用方设置各种配置选项是否很自然?或者有没有其他更好的方法? 当被调用方需要将数据流式传输回其调用方时,像上面的context.log这样的方法是否合适,还是应该使用yield?yeild看起来很自然,但我担心这会超出大多数编剧的头脑 我的方法要求脚本使用预定义的名称定义函数,例如run、init、shutdown。这是一个好方法吗?如果不是,还有什么机制更自然? 我将相同的配置、上下文和缓存参数传递到每个方法中。使用单个上下文参数会更好吗?使用全局变量会更好吗? 最后,您是否建议使用现有库使这种简单的脚本运行容器更易于编写?
看看用python处理数据库的SQL炼金术。另外,为了使脚本编写更容易处理并发性,请查看无堆栈Python