【问题标题】:Monitoring component via LOAD通过 LOAD 监控组件
【发布时间】:2017-02-22 13:00:11
【问题描述】:

目前我正在为以下目的编写一个组件“collaboration_control”:

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

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

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

提前感谢您的支持!

最好的问候 克莱门斯

【问题讨论】:

    标签: web2py


    【解决方案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 的东西。

    【讨论】:

    • 安东尼,非常感谢!!!你知道的:一如既往,你的答案就是解决方案!最好的问候,克莱门斯
    • 不客气。如果服务器负载成为问题,我在最后添加了一条说明建议替代方法。
    • 好的,谢谢!我会密切关注由此产生的流量。如果它太高,推送机制真的是一种替代方案。我会及时通知你...
    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多