如何在不进行轮询的情况下获取数据?

时间:2018-08-01 14:14:20

标签: algorithm function theory polling period

这更多是一个理论问题。

好吧,想象一下我有两个同时工作的程序,主要程序只有在他从辅助程序收到标记为true的标志时才做某事。因此,此主程序具有一个函数,该函数将不断向辅助程序询问标志的值,当它变为true时,它将执行某些操作。

我在大学里学到的是 polling 是最简单的方法。但是,当我开始从事开发人员工作时,同事告诉我,这种方法会通过每隔一定时间要求一个值来产生一些开销或浪费计算资源。

我试图提出一些以不同方式进行此操作的想法,在互联网上搜索了此类内容,但没有找到一种有用的方法来实现此目的。

我读到了有关中断和被动方式的信息,这些干扰和被动方式仅在次要程序通知的情况下才可能使主程序获取该数据。但是,这是怎么发生的呢?主程序将需要一个功能来检查是否中断?因此,它不会以以前的方式结束吗?

我可以做些什么?

example

4 个答案:

答案 0 :(得分:2)

防止轮询的典型方法是使用Publish/Subscribe模式。

您的客户端程序将订阅到服务器程序,并且当事件发生时,服务器程序将发布给所有订阅者以供他们处理所需的内容。

答案 1 :(得分:2)

没有魔术... 没有程序会猜测何时有新信息要读取,您所能做的就是在两种方法之间做出决定,

A -> asks -> B  
A <- is informed <- B

何时使用每个?这取决于许多其他因素,例如:

1-从生成数据的那一刻起,您需要多快的时间发送数据?越远越好?或保持片刻
2-数据生成速度有多快?
3-多少simoultaneuos客户端正在同一服务器上请求数据
4-您要处理哪种类型的数据?持久吗?快速变化?

如果您要构建类似股票分析仪的工具,则需要每秒询问一次股票价格(并且每秒还会询问价格),您提到的方法可能是最好的

如果您正在编写类似whatsapp之类的基于聊天的应用程序,则需要检查是否有一些新消息发送给客户端,并且大多数时候不会...发布订阅可能是最好的

但是所有这些都是对高影响力体系结构决策的非常肤浅的了解,仅凭一个因素就不可能获得最佳效果

我要显示的是

  

同事告诉我,这种方法会产生一些开销,或者   浪费计算

这不是正确的陈述,它可能在某些特定情况下,但是开销将始终存在于分布式系统中

答案 2 :(得分:0)

如果您翻转请求的顺序,最终将得到类似于标准Web API的内容。您的主程序(在示例中左侧)将是一台侦听请求的服务器。辅助程序将是客户端点击服务器上的端点以触发事件。

有多种方法可以用每种语言来完成此任务,并且不必将其绑定到tcp / ip请求。

我很快会为您添加一些链接。

答案 3 :(得分:0)

好吧,在大多数语言中,您都不会实现如此低的水平。但是从理论上讲,有不同的等待策略,您在谈论主动等待。这样一来,您就可以轻松吃饱所有记忆。

大多数语言都实现了库,使您可以将进程作为服务启动,该进程处于被动等待状态,并在请求到来时触发。