2016-01-11 36 views
3

所以我有一些代碼,其功能是這樣的通用代碼:谷歌應用程序引擎 - 異步代碼塊?蟒蛇

for blah in blahs: 
    blah.take_forever() 

for blah2 in blah2s: 
    vars = blah2.take_forever() 
    for var in vars: 
    var.also_take_forever() 

我想,像異步功能,如

async_start_blah2_loop_then_do_someting_else() 

do_the_first_blah_loop() 

gather_results_and_send_them_out() 

不過,我沒有使用的數據存儲或東西這是一個urlfetch,那麼還有哪些其他選項可以加速這個過程?

map_async(callback, pass_batch_into_callback=None, merge_future=None, **q_options) 
Asynchronously map a callback function or tasklet over the query results. This is the asynchronous version of map(). 

似乎只適用於數據存儲區查詢。

對此提出建議?

+1

線程和/或異步操作只會在您等待其他需要時間的服務時起作用。如果它全部以計算爲導向,那麼你將不會獲得任何收益。一種方法可能是將每個「take_for_ever」操作分解爲對appengine基礎架構的單獨離散調用。讓前端發出請求,你可能會碰到多個實例 –

+0

@Tim,是的,我嘗試了線程,這是由於另一種服務需要時間反對計算(但不是應用程序引擎服務)。現在,angularjs正在向我的服務器發送ajax信息,其中包含需要一段時間的代碼。然而,昨天晚上我想我可能會嘗試使用帶有angularjs的隊列服務,並將這兩個函數放在兩個不同的處理程序上,以便任一函數在結束時返回結果,而不是等待另一個函數。 –

回答

2

您可以在App Engine中使用Python的原生threading模塊異步執行函數(請參閱threading.Thread)。這也適用於自動縮放實例,因爲它使用「綠色」線程而不是操作系統線程。

def blahFunc(): 
    for blah in blahs: 
    blah.take_forever() 

def blah2Func(): 
    for blah2 in blah2s: 
    vars = blah2.take_forever() 
    for var in vars: 
     var.also_take_forever() 

# Execute both loops 'at the same time' 
background = threading.Thread(target=blah2Func) 
background.start() 
blah1Func() 

注意,你不一定會得到任何與此速度(我假設你是爲了簡單起見,一個人爲的例子)作爲請求還是一樣的「真正的」 OS線程中執行,但如果它是有用的需要避免長時間操作阻塞。

如果您的運行時間很長,可能需要運行比請求更長的時間,那麼更好的解決方案是使用Task Queues

+0

blah代碼是在一個def post(self)..我需要對post函數的響應反饋給做了ajax調用的帖子以修改$ scope變量的angularjs ... don'我呢?我不太確定如果我使用任務隊列,這將如何工作。我是angularjs的新手。那可能嗎?在所有令人困惑的措辭之後,我的意思是,是否可以使用任務隊列來更新HTML頁面上的$ scope變量? –

+0

所以我試過線程。你是對的,假設我不得不調用background.join(),它花費了大致相同的時間,因爲第一個函數很快,第二個函數很慢。 –

+0

在你的情況下,因爲你依賴於客戶端的結果,所以在後端做異步將不會提供任何淨收益(因此任務隊列也將被淘汰)。異步部分應該以ajax調用的形式發生在客戶端。如果你阻止了ajax調用的結果,這將是重新考慮你的設計的時候,因爲它在ajax中擊敗了「異步」的點。 – Adam

相關問題