2012-12-25 30 views
3

我在我的app.yaml中使用Google App Engine 1.7.4上的Python 2.7運行時與threadsafe: true我是否需要在Google App Engine中使用線程同步工具?

我有以下代碼:

@ndb.tasklet 
def fn_a(container): 
    ''' access datastore and mutate container ''' 

@ndb.tasklet 
def fn_b(container): 
    ''' access datastore and mutate container ''' 

@ndb.toplevel 
def parallel_fn(): 
    shared_container = set() 

    yield fn_a(shared_container), fn_b(shared_container) 

fn_a()fn_b()接入和變異shared_container,被稱爲在parallel_fn()shared_container是標準庫set,因此不是線程安全的。

是否應該將shared_container的增變器/存取器方法包裝在適當的threading標準庫鎖中?

從我所瞭解的App Engine中,儘管設置爲threadsafe: true,但每個實例都是單線程的。所以使用threading鎖對象不是必需的?

初步測試顯示不需要鎖定,只會增加額外的開銷以及死鎖。它也似乎以下不應該做

if object not in shared_container: 
    yield any tasklet operation 
    shared_container.add(object) 

shared_container可能被執行的另一條線的yield操作呈現object not in shared_container聲明可能無效的過程中被更新。然而,

if object not in shared_container: 
    shared_container.add(object) 
    yield any tasklet operation 

將是絕對好的。

回答

3

您不需要添加鎖定代碼,因爲tasklet不會在單獨的線程中運行。在tasklet docs.

中閱讀關於它的內容如果設置了threadsafe:true,則GAE是多線程的。啓動不同的線程來處理同一實例上的多個請求。通常這不是問題,因爲您應該設計請求處理程序以便能夠跨各種服務器實例運行。

這並不適用於這個問題,但如果您真的測試過線程問題,請小心。我不確定,但我相信在dev_appserver和生產GAE服務器上運行時,線程行爲是不同的,所以請確保您在兩者上進行測試。

+0

這個。他解釋說它很好 –

相關問題