Twisted文檔使我相信,在相同的應用程序中結合諸如reactor.spawnProcess()
和threads.deferToThread()
等技術是可以的,以便反應器能夠在封面下處理這個問題。在實際嘗試之後,我發現我的應用程序發生死鎖。自己使用多個線程,或者自己使用子進程,一切都很好。Twisted:一起使用多個線程和進程
縱觀反應堆來源,我發現SelectReactor.spawnProcess()
方法只是簡單地調用os.fork()
而不考慮可能正在運行的多個線程。這解釋了死鎖,因爲從os.fork()
的調用開始,您將擁有兩個進程,其中有多個併發線程正在運行並執行誰知道同一文件描述符是什麼。
我對SO的問題是,解決這個問題的最佳策略是什麼?
我想到的是子類SelectReactor
,因此它是一個單例,並且只在實例化時立即調用os.fork()
一次。子進程將在後臺運行,並充當父進程的服務器(使用管道上的對象序列化來回傳遞)。父級繼續運行該應用程序,並可根據需要使用線程。調用父母中的spawnProcess()
將委派給子進程,子進程將保證只有一個線程正在運行,因此可以安全地調用os.fork()
。
有沒有人做過這個?有更快的方法嗎?
謝謝。我沒有想過childFD。一些有dup2的雜技可能就足夠了,但這意味着更多的工作。如果我能把它弄明白的話,我會把它縮小到我能夠做到的最小的測試案例,並從事扭曲矩陣。我會傳遞setcheckinterval策略,但其他人可能會接受。 – wberry 2011-05-19 15:46:58