2009-12-08 90 views
0

我有一個很好的線程問題,我用它來生成和服務Zope中的動態圖形和圖表。請參閱this question瞭解我的原始問題。由於該網站已經投入使用,我沒有時間去調試該庫(我不是C或線程方面的專家),因此我正在尋找快速解決方案。我能想出的最好的辦法是使用mod_wsgi的作爲某種後衛:限制某些URL到單個線程

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不受直接訪問保護,原始問題僅在圖表同時下載時纔會出現,只有當用戶使用多個嵌入的動態圖表查看頁面時纔會發生。然而,這個「解決方案」(如果它甚至有效的話)使得我腦海中的小計算機科學家像嬰兒一樣哭泣。任何更好的想法?

+0

你不會說你的情況與一些「計算機科學」原理背道而馳,所以很難回答你的問題。 – 2009-12-08 15:19:57

+0

嗯,我只是認爲這是一個醜陋的黑客攻擊,我很感興趣,如果有可能是一個解決方案少用黑客,也許使用指令或apache模塊,我不知道 – 2009-12-08 15:25:23

回答

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> 

換句話說,推廣應用到多個守護進程組,使用位置指令,委託它們是單線程程序組中要處理的具體網址。

注意,通常不會使用'processes = 1',因爲無論如何WSGIDaemonProcess默認爲一個進程。在這種情況下,我們確實需要它,因爲任何'processes'選項的使用都會導致'wsgi.multiprocess'被設置爲True,在這種情況下,我們仍然希望該標誌對於'多線程'流程是正確的,以便代碼知道它是是多進程配置的一部分,即使該特定守護進程組只有一個進程。

+0

這是有道理的。最終將Zope實例移至WSGI將是一個很好的藉口。感謝您的詳細解釋! – 2009-12-08 20:20:20