我在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 app限制为一个进程,所以它应该防止任何线程问题。该网站的数量不高,我真的不在乎这是否会让我失去一些性能。此外,我不关心/_graphs
URL不受直接访问保护,原始问题仅在同时下载图表时出现,这仅在用户查看包含多个嵌入式动态图表的页面时才会出现。 / p>
然而,这个“解决方案”(如果它甚至可以工作)让我脑子里的小计算机科学家像婴儿一样哭泣。有更好的想法吗?
答案 0 :(得分:2)
您无需重定向。做:
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,在这种情况下,我们仍然希望该标志对于'多线程'进程是真的,以便代码知道它是多进程配置的一部分,即使该特定守护程序进程组中只有一个进程。