简介
在经历了大约10年的PHP开发和习惯之后,我最近转向了Python。在
在Symfony2中,每个对服务器的请求(例如Apache)都必须加载Eg.container类并实例化它,以构造对象的“rest”。在
据我所知(我希望)Python的wsgienv,一个应用程序只创建一次,在该应用程序关闭之前,每个请求都只调用方法/函数。在
这意味着我可以拥有某个类的一个实例,每次请求被调度时都可以访问它,而不必在每个请求中实例化它。我说得对吗?在
问题
我想要一个类的实例,因为对__init__
的调用非常昂贵(在计算和资源锁定中)。在PHP中,在每个请求中实例化这个会降低性能,使用Python的WSGI,我可以在应用程序启动时实例化一次,然后通过请求使用它,对吗?如果是这样的话,我如何做到这一点?在
在
pyramid
中有很多方法可以做到这一点,这取决于您最终想要完成的任务。仔细研究一下Pyramid/SQLAlchemy tutorial作为一个示例,说明如何处理昂贵的初始化(数据库连接和元数据设置),然后将其传递到请求处理引擎中,这可能很有用。在请注意,在引用的链接中,问题的重要部分是}的后续创建。在
__init__.py
文件对initialize_sql
的处理以及{WSGI仅仅是一个标准化的接口,它使得构建web服务器体系结构的各种组件成为可能,以便它们能够相互通信。在
金字塔是一个框架,其组件通过WSGI相互粘合。在
与其他WSGI框架一样,Pyramid允许选择堆栈中实际的服务器部分,如gunicorn、Apache或其他。这个选择是你自己做的,你的问题就有了最终的答案。在
您需要知道的是您的服务器是多线程还是多进程。在后一种情况下,仅仅检查全局变量是否已实例化以初始化代价高昂的资源是不够的,因为后续的请求可能会在不共享状态的单独进程中结束。在
如果您的模型是多线程的,那么您可能确实依赖于全局状态,但请注意,您在代码中引入了一个强依赖性。也许单例模式与依赖注入相结合可以帮助您保持代码更干净,更易于更改。在
我发现的最好的方法是在金字塔文档中提到的(我之前错过了):
来自Pyramid Docs#Startup
相关问题 更多 >
编程相关推荐