2008-09-26 51 views
4

我正在使用django應用程序,並且使用cherrypy作爲服務器。 Cherrypy爲每個頁面視圖創建一個新線程。我希望能夠從任何這些線程中訪問所有這些線程(負責與django交談的線程)。更具體地說,我希望能夠從任何這些線程中訪問每個線程的thread_data。這可能嗎?如果是這樣,我該怎麼做?cherrypy如何處理用戶線程?

回答

6

CherryPy的wsgiserver不爲每個請求創建一個新的話題 - 它使用一個游泳池。這些工作線程中的每一個都是threading.Thread的子類,所以它們都應該可以通過threading.enumerate()來訪問。

不過,如果你對cherrypy.thread_data具體講,這是別的東西:一個threading.local。如果你使用的是Python的最新版本,那麼所有這些都是用C語言編寫的,你(可能是正確的)不能從Python跨線程訪問它。如果你真的需要它和真的知道你在做什麼,最好的技術,通常是在它們插入thread_data結構,同時在全球集裝箱堅持一個額外的參考這樣的事情。我推薦使用weakrefs作爲這些全局容器的關鍵字 - 有足夠的Python ORM將它們用於連接池(例如,參見我自己的Geniusql),您應該能夠學會如何相當容易地實現它們。

4

我對這樣的問題,第一反應就是不告訴你如何把它做,但強調一點,你真的應該與此前進之前重新考慮。我通常回避線程化Web服務器,轉而採用多進程或異步解決方案。向混音添加顯式的線程間通信只會增加這些恐懼。

當問到這樣的問題時,有一個更深的目標。我懷疑你認爲線程間通信能夠解決的問題實際上可以通過其他更安全的方式解決。

+0

你能更具體嗎? – willurd 2008-10-04 20:55:41