通过LOAD监控组件

时间:2017-02-22 13:00:11

标签: web2py

目前我正在编写一个组件' collaboration_control'出于以下目的:

显示由任何其他组件在数据库中写入的任何新闻。这意味着,如果另一个组件(甚至由其他用户在其自己的环境中以协作的方式使用)在表“update_information”中写入相关条目,则协作控制组件应该读取并显示它。

我通过LOAD将协作控制组件加载到空DIV。然后组件在DB中查找任何新的相关条目。当然,这种ping机制会产生可测量的CPU负载。作为一种解决方案,我在协作控制组件中使用time.sleep()例如5秒钟,然后重新加载自己以进行下一次查找。但在这5个睡眠时间内,该页面的所有其他组件也都在睡觉: - (

因此我的问题是: 如何在web2py中实现异步查找组件?

提前感谢您的支持!

祝你好运 克莱门斯

1 个答案:

答案 0 :(得分:1)

如果您使用time.sleep(),听起来好像是导致Ajax请求在服务器上暂停,强制每个请求花费5秒钟。这不是一个好主意,因为它将占用整个5秒的Web服务器线程。此外,如果您使用默认的基于文件的会话,保持打开Ajax请求几秒钟将阻止其他Ajax请求完成,因为每个请求都会锁定会话文件。为了缓解这个问题,您可以在5秒暂停之前显式解锁会话文件,但是有一个更好的方法,即让浏览器在发出Ajax请求之间等待。

实际上,LOAD()助手具有内置功能,可以按指定的时间间隔重新加载。例如:

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

以上将每5秒重新加载一次组件(但Ajax请求将快速返回,并通过Javascript在浏览器中完成等待。)

注意,根据您的流量级别,每隔几秒通过Ajax轮询可能会给您的服务器带来太多负载。在这种情况下,您可以考虑采用更有效的基于推送的替代方案,例如web2py的websocket_messaging功能或类似Nchan的内容。