2014-10-03 66 views
3

「可重入」可能不是合適的術語,但我認爲它很接近。Google Apps腳本是否可重入?

如果我與另一個用戶共享一個腳本,並且我們同時執行它,我們是否覆蓋其他變量?或者兩個執行是否發生在完全不同的內存空間中?

我在哪裏可以看到這個?

如果可重入是錯誤的術語,那麼正確的術語是什麼?

更新14/10/03 o9:45 EDT: 我不認爲這個權證要求一個新的問題。

我從Serge和Henrique瞭解到單獨執行是「線程安全」的,並且共享資源上的操作需要保護,大概是Lock Service

我想確定如何合理化我目前的特設「戰略」。我有一個Web應用程序,它使用電子表格來跟蹤很多設置,包括查詢其他大型電子表格以查找列入短名單的數據。我與另一個用戶共享副本,然後與另一個用戶共享。現在我有一堆電子表格和腳本副本來跟蹤。 (這種增長方式 - 不要問)。我不想丟失「本地緩存」電子表格,但我確實希望避免不必要地共享線程安全腳本的多個副本。

我正在考慮一個集中的查找表,它將本地緩存電子表格與給定的用戶配對,但它真的開始看起來像我應該用BigQuery或一些更嚴重的存儲重寫整個事情。儘管如此,這看起來更加努力。

任何建議,將不勝感激。

更新14/10/03 12:15 EDT:

最初的Web應用程序載於電子表格,但我搬出來,讓他們一起分享。增加瘋狂。我現在有一個腳本,使用DriveApp創建目錄,與用戶共享,複製電子表格和腳本以及其他一些內容。實際上,爲了安全起見,除了WebAppScript之外,我還有WebAppScriptProxy來發布WebAppScript的公共功能。這就是用戶與之交互的內容。

+0

答案非常相似,我不能輕易說出哪些是*更正確。我必須給Henrique「提供」線程安全「。我感謝你們兩位。 – 2014-10-03 13:50:59

+0

您的Web應用程序是否包含在此「本地緩存」電子表格中?你和其他用戶分享了這張表,他們已經制作了他們自己的副本,還部署了他們自己的Web-App副本? – 2014-10-03 14:05:11

+0

@Hasan - 不錯的選擇,他是最好的(他教會了我很多知識;-)永遠感謝這!!)但是,無論如何感謝;-) - 關於你的編輯:你能詳細說明什麼樣你想到的工作流程?其他用戶在做什麼? – 2014-10-03 14:15:54

回答

3

它在完全不同的記憶空間。

我不認爲「reentrant」這裏是最準確的術語,因爲不會中斷代碼來運行他人的代碼。他們都同時並安全地發生。我不確定正確的術語是什麼。我想你可以說整個環境是「線程安全的」,因爲它們在不同的線程/進程中執行,並且沒有變量共享。

你只需要採取共享資源的照顧,像一個普通的電子表格或文檔屬性等

--edit

這是很難理解你的設置,但無論如何,我會建議的方法。首先,我建議您只有一個腳本,並且只與您的用戶共享其部署的URL(而不是腳本本身)。關於將電子表格與BigQuery結合起來,對BigQuery提出建議是不可能的。如果你有這方面的知識並願意與之合作,那就去做吧。但我認爲您可以使用Google Sheets解決問題,因爲它繼承併發性是一個相當不錯的簡單腳本數據庫。

底線,只與你的用戶分享你必須做的事情,並保持一切隱藏。這對他們和你來說更簡單。例如,如果他們不需要手動編輯您的「本地緩存」電子表格,那麼請與他們共享。再次,如果他們需要的一切都是訪問您的網絡應用的鏈接,那麼不要讓它更復雜。

3

不是隻有你和另一個用戶,而且你和自己之間的2個不同功能的(例如但不僅限於)2瀏覽器窗口調用...

這就是爲什麼你不能使用全局變量的常用方式在谷歌Apps腳本:每次執行任何功能,所有的全局變量被重新初始化,並且他們只在調用這個函數(和所做的任何函數調用中此功能的範圍可

保持聯繫。當然,這隻適用於腳本變量,顯然不適用於文檔或其他永久性存儲位置(例如,屬性)無情的執行將肯定會通過互相覆蓋來創建併發問題。

0

我傾向於認爲腳本更接近於用Perl,Python,Bash等編寫的優秀的老式CGI腳本。只有這一次它是用JavaScript編寫的。

每次點擊服務器時,Web服務器都會從頭啓動新版本的腳本。

這是一個有點發燒友,因爲它有一個漂亮的框架,它用來來回移動信息。但這就是它。