2015-07-19 26 views
2

我正在構建一個頁面,用戶可以在其中生成自定義計時器。這些定時器通過setTimeout在一個heroku nodejs後端運行。然而,我有點擔心可能有幾千個長時間setTimeouts同時運行。很多setTimeouts的結果

我發現了this SO問題,它指出javascript定時器在瀏覽器中的單獨線程上運行。在nodejs中的情況是一樣的嗎?如果是這樣,那麼在這個線程上有數千個計時器會有什麼後果呢?

編輯:一些關於我想要做什麼的更多信息。我正在構建一個同步頁面,可以放在屏幕上,然後用戶可以訪問瀏覽器中的頁面並更改其實例的內容。這將在所有打開的頁面實例中反映出來。用戶還應該能夠設置定時器,這應該在定時器結束時推送新的內容。這正是我正在考慮使用服務器端setTimeouts來完成的。我知道我應該使用heroku調度器插件之一,但我想降低成本(這種頁面不完全是賺錢者)。最後,用戶應該能夠生成他們自己的這個頁面的實例,以及一個新的url等。這是可擴展性問題的起因。如果存在100個頁面實例,並且每個實例都設置了10個計時器,則在後端有1000個計時器。

+3

你究竟想要做什麼? 「成千上萬的定時器」聽起來不像是適合任何事情的解決方案。 – robertklep

+0

這聽起來不像一個明智的設計決定,即使它會「安全」。如果你可以進一步解釋你的用例,我相信你可以得到一些有趣的回覆(例如,不使用'setTimeout' :-) – Amit

+0

爲什麼不試試它,看看它是否工作爲你還是不? – mscdex

回答

1

基於在評論MSCDEX的解釋:

爲timers.js的源代碼是很容易做到,但基本上什麼情況是,雙方的setTimeout()和setInterval)與所有呼叫(相同的過期/間隔分組在一起並使用相同的後備計時器。這些setTimeout()/ setInterval()請求會按照它們添加的順序追加到與該定時器相關的列表中,以便每當定時器觸發時,它都會迭代列表(執行回調),直到達到超時過期了。此時,它等待當前時間與該組中下一次超時之間的增量。我希望這是有道理的。

我得出的結論是,有很多setTimeouts對性能沒有不利影響,因爲它們都是一個計時器。只是回答自己,因爲沒有人做。

+0

你在描述什麼聽起來更像是一個帶有隊列的[cron](https://github.com/ncb000gt/node-cron)。 –