2017-02-22 29 views
0

目前,我正在爲以下目的編寫組件'collaboration_control':通過LOAD監測組件

顯示由任何其他組件寫入數據庫的任何消息。這意味着,如果另一個組件(甚至由其他用戶在其自己的環境中以協作方式使用)在表'update_information'中寫入相關條目,協作控制組件應讀取並顯示它。

我正在通過LOAD將協作控制組件加載到空的DIV。然後組件正在數據庫中查找任何新的相關條目。當然這個ping機制會產生可測量的CPU負載。作爲一個解決方案,我只在協作控制組件中使用了time.sleep(),例如5秒鐘,然後重新加載自己以用於下一次查找。但是,這5秒的睡眠過程中頁面的所有其它部件都睡太:-(

因此,我的問題是: 我怎樣才能在web2py中實現異步查找組分

預先感謝?任何支持!

問候 克萊門斯

回答

1

如果使用time.sleep(),它聽起來就像你正在導致Ajax請求暫停在服務器上,迫使每個請求需要5秒。這不是一個好主意,因爲它將佔用Web服務器端整整5秒鐘。此外,如果您使用默認的基於文件的會話,則持續打開Ajax請求幾秒鐘將阻止其他Ajax請求完成,因爲每個請求都會鎖定會話文件。爲了緩解這個問題,你可以在5秒暫停之前明確地解鎖會話文件,但是有一個更好的方法,它讓瀏覽器在做Ajax請求之間等待。

實際上,LOAD()幫助程序具有內置的功能,可以按指定的時間間隔重新加載自身。例如:

{{=LOAD(..., ajax=True, timeout=5000, times='infinity')}} 

上面將刷新分量每5秒(但Ajax請求將快速返回,以等待通過JavaScript在瀏覽器中被完成)。

請注意,根據您的流量級別,每隔幾秒通過Ajax進行輪詢可能會給您的服務器帶來太多負載。在這種情況下,您可能會考慮一種更高效的基於推送的替代方法,例如web2py的websocket_messaging功能或類似Nchan

+0

安東尼,非常感謝! 你知道它:一如既往,你的答案就是解決方案! 此致敬禮, 克萊門斯 – Clemens

+0

不客氣。如果服務器負載成爲問題,我在最後添加了一個註釋,提出了一種替代方法。 – Anthony

+0

好的,謝謝!我會密切關注由此產生的流量。如果它太高,推動機制將是真正的替代選擇。我會告訴你... – Clemens