2017-09-10 46 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