我對如何在python/twisted中編寫異步代碼有點困惑。假設(爲了討論)我露出一個功能向世界表明將採取一系列並返回true/false,如果它是一個素數/非黃金,所以它看起來依稀像這樣:扭曲:使代碼非阻塞
def IsPrime(numberin):
for n in range(2,numberin):
if numberin % n == 0: return(False)
return(True)
(剛說明)。
現在讓我們說有一個Web服務器需要根據提交的值調用IsPrime。大型numberin
需要很長時間。
如果在此期間另一個用戶請求小數的素數,有沒有辦法使用reactor/deferreds體系結構異步運行這兩個函數調用,以便在計算結果之前返回short calc的結果長期計算?
我明白如何做到這一點,如果IsPrime功能來自其他網絡服務器,我的網絡服務器將做一個延期的getPage,但如果它只是一個本地功能?
即,可以以某種方式扭曲兩次調用IsPrime之間的時間共享,還是需要顯式調用新線程?
或者,IsPrime循環是否需要分成一系列較小的循環,以便控制可以快速傳回反應堆?
還是別的什麼?
當你有一個真正需要很多時間的功能,例如。它是「阻塞」的,你可以使用'deferToThread()'在一個線程中運行它:http://twistedmatrix.com/documents/11.0.0/api/twisted.internet.threads.deferToThread.html – 2011-05-24 22:31:01
或Twisted's Process支持:http://twistedmatrix.com/documents/current/core/howto/process.html – 2011-05-24 22:32:50
哈,我寫了一個[非常類似的問題](http://stackoverflow.com/questions/5719782/confusion-about-cpu最近在Node.js中使用-intensive-code-in-node-js)。有興趣瞭解Twisted中的解決方案。 – YXD 2011-05-24 23:41:13