0

我们有一个配置为运行pyramid+sqlalchemy应用程序的服务器modwsgi+apache2

我们在__init__.py金字塔应用程序中有一些东西可以创建数据库并预填充一些测试用户和帐户。它类似于这里的金字塔食谱示例中的 initialize_sql 函数

Out apache config 看起来像这样(从某个地方复制并被黑):

WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
WSGIDaemonProcess pyramid user=ubuntu group=staff processes=1 \
   threads=4 \
   python-path= VIRTUAL_ENV_SITE_PACKAGES
WSGIScriptAlias / WSGI_SCRIPT_PATH

<Directory /Users/chrism/modwsgi/env>
  WSGIProcessGroup pyramid
  Order allow,deny
  Allow from all
</Directory>

困扰我们的是,它initialize_function会被许多请求调用,而不是只被调用一次。我们不了解 apache 是如何工作的,也不了解我们在配置中做了什么。我们希望能够__init__.py一次调用函数,仅此而已。有人可以解释 apache 的实际工作原理以及为什么金字塔__init__.py一直在重新加载。还要解释我们如何确保__init__.py不会重新运行每个请求

考虑分享关于相同内容的简单易懂的链接:)

4

2 回答 2

2

像创建数据库和预填充它这样的事情不应该进入__init__.pyWSGI 应用程序的文件中,因为正如您所注意到的,只要您启动服务器(以及在某些其他点),该文件就会运行。

您需要的是一个可以在需要时从命令行调用的脚本。每个框架都提供了自己的构建方式。在 Pyramid 中,它们被称为console scripts在这里,您可以找到有关如何自己构建的文档。

但是,我建议您使用本教程中的脚手架(项目模板)并查看名为initialize_tutorial_db. 它完全符合您的要求,并允许您在需要时从命令行创建/初始化数据库。


关于 apache 配置,与您的问题相关的行如下:

WSGIDaemonProcess pyramid user=ubuntu group=staff processes=1 \
   threads=4 \
   python-path= VIRTUAL_ENV_SITE_PACKAGES

这意味着您将使用4 个线程启动1 个进程。这不应该意味着您文件中的代码会运行多次。这更有可能是由于您手动重新启动服务器或通过代码更改引起的。__init__.py

于 2013-02-11T16:46:04.753 回答
1

诀窍是产生多个实例WSGIDaemonProcess来处理所有进入 Apache 的请求。甚至有可能在这些进程中,创建了多个线程来(大部分)同时处理请求。您应该尝试保护您的 initialize_function(),使其每个进程(或线程)仅运行一次,例如通过跟踪它是否已经运行。一般来说,最好将您的操作/资源管理范围限定为请求的生命周期。

于 2013-02-11T10:31:10.407 回答