【问题标题】:Restrict certain URLs to a single thread将某些 URL 限制为单个线程
【发布时间】:2009-12-08 15:09:53
【问题描述】:

我在 Zope 中用于生成和提供动态图形和图表的库有一个不错的小线程问题。请参阅 this question 了解我原来的问题的描述。

由于该网站已经投入生产,我没有时间调试该库(我不是 C 和线程方面的专家),因此我正在寻找快速修复。我能想到的最好的主意是使用 mod_wsgi 作为某种警卫:

WSGIScriptAlias /graphs /path/to/my/app.wsgi
WSGIDaemonProcess mysite user=www-data group=www-data processes=1 threads=1

/path/to/my/app.wsgi 的 wsgi 应用程序将简单地将每个请求重定向到 /_graphs,这再次由 Zope 处理。因为我将 wsgi 应用程序限制为一个具有一个线程的进程,所以它应该可以防止任何线程问题。该网站的容量不高,我真的不在乎这是否会降低我的性能。另外,我不在乎/_graphs URL 没有受到直接访问保护,只有在同时下载图表时才会出现原始问题,这仅在用户查看包含多个嵌入式动态图表的页面时才会发生。

尽管如此,这个“解决方案”(如果它真的有效的话)让我脑海中的小计算机科学家哭得像个婴儿。有更好的想法吗?

【问题讨论】:

  • 你没有说你的情况违反了一些“计算机科学”原则,所以很难回答你的问题。
  • 好吧,我只是认为这是一个丑陋的 hack,我很感兴趣是否有一个更少 hack 的解决方案,可能使用我不知道的指令或 apache 模块

标签: apache multithreading mutex mod-wsgi


【解决方案1】:

您不需要重定向。做:

WSGIDaemonProcess multithreaded processes=1 threads=15
WSGIDaemonProcess singlethreaded processes=3 threads=1

WSGIScriptAlias / /path/to/my/app.wsgi

WSGIProcessGroup multithreaded

<Location /graphs>
WSGIProcessGroup singlethreaded
</Location>

换句话说,将应用程序分布在多个守护进程组中,使用 Location 指令来委派要在单线程进程组中处理的特定 URL。

注意,通常不会使用“processes=1”,因为 WSGIDaemonProcess 无论如何都默认使用一个进程。在这种情况下,我们确实想要它,因为任何使用 'processes' 选项都会导致 'wsgi.multiprocess' 设置为 True,在这种情况下,我们仍然希望该标志对于 'multithreaded' 进程为真,以便代码知道它是多进程配置的一部分,即使该特定守护进程组中只有一个进程。

【讨论】:

  • 这是有道理的。最终将 Zope 实例迁移到 WSGI 将是一个很好的借口。感谢您的详尽解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
相关资源
最近更新 更多