2017-09-10 48 views
0

我正在使用Tornado異步框架來實現REST Web服務器。在Tornado上運行異步後臺任務

我需要在相同服務器的背景上運行高CPU負荷週期性任務

這是一個低優先級定期任務。它應該始終在所有空閒內核上運行,但我不希望它影響Web服務器的性能(在HTTP請求負載過重的情況下,它應該具有較低的優先級)。

我可以使用Tornado IOLoop API嗎?

我知道我可以使用tornado.ioloop.PeriodicCallback來調用週期性的後臺任務。但是,如果這項任務的計算量很大,我可能會對Web服務造成性能問題。

回答

1

龍捲風(或在Python 3 ASYNCIO)或任何其他單進程事件迴路基於溶液並不意味着被用於CPU密集型任務。您只能將它用於IO密集型任務。

「背景」這個詞的意思是說,你並沒有等待結果(我稱它有時是無人看管的任務)。更重要的是,如果後臺任務阻塞,應用程序的其餘部分必須等待,與請求處理程序阻塞的方式相同,其他部分(包括背景)將被阻止。

您可能會考慮使用線程,但在Python中,這也不是解決方案,因爲GIL

正確的解決方案是:從網絡服務器

+0

感謝您的答覆。如果我將工作人員與Web服務器分開,這意味着我不能讓工作人員在同一臺服務器上運行,而不必擔心是否會影響Web服務器。所以你建議在不同的隔離核心上使用另一個進程? (我現在讓Tornado產生一個每核心進程) – ShaharA

+0

我不知道你的配置是什麼。內核調度程序將很好地處理進程管理(及其資源),但是當然每個進程都可能使cpu,io,mem飢餓,解決方案可能是使用cgroups(普通或像docker這樣的容器)。關鍵信息再次是你有多少資源,以及工作者,網絡服務器需要多少,而沒有測試你需要水晶球;) – kwarunek