精华内容
下载资源
问答
  • polling & long polling 转载:https://www.cnblogs.com/chenny7/p/3954396.html 参考:http://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet ...

    polling & long polling

    转载:https://www.cnblogs.com/chenny7/p/3954396.html

    参考:http://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet

     

    1、轮询(Polling)是指不管服务器端有没有更新,客户端(通常是指浏览器)都定时的发送请求进行查询,轮询的结果可能是服务器端有新的更新过来,也可能什么也没有,只是返回个空的信息。不管结果如何,客户端处理完后到下一个定时时间点将继续下一轮的轮询。


    2、长轮询(Long Polling)的服务其客户端是不做轮询的,客户端在发起一次请求后立即挂起,一直到服务器端有更新的时候,服务器才会主动推送信息到客户端。 在服务器端有更新并推送信息过来之前这个周期内,客户端不会有新的多余的请求发生,服务器端对此客户端也啥都不用干,只保留最基本的连接信息,一旦服务器有更新将推送给客户端,客户端将相应的做出处理,处理完后再重新发起下一轮请求。可见,长轮询的特点:

    • 服务器端会阻塞请求直到有数据传递或超时才返回;
    • 客户端响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接;
    • 当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。

     

    举个例子说明下就很清楚了:

    1、轮询模式,假设是客户端每2秒轮询一次,那么客户端每2秒就会发送一次请求,相应的服务器端每2秒就要响应这个客户端的一次请求。而实际上服务器端可能1秒钟后就有更新,也可能1分钟后才有更新。对于1秒钟就有更新的,客户端至少会有1秒钟的延时;而1分钟后才有更新的,只有最后一次查询有意义,这一分钟内的轮询其实都是没有必要的,服务器端和客户端均有资源的浪费。

    2、推送模式,客户端发送一次请求后马上挂起等待服务器端响应,可能1秒,也可能10秒钟,也可能1分钟。如果服务器端是1秒就有更新,那么到1秒钟时客户端马上就收到更新了,如果是1分钟才有更新,那么整个一分钟客户端也只请求一次,服务器也只会相应一次,这个跟轮询的区别是不是已经很清楚了。

     

     

     


     

    websocket

    轮询和长轮询都是使用普通的HTTP协议传输数据,它只允许client单方面发起请求,然后server进行响应,而不能主动给client发送数据。

    WebSocket协议是HTML5定义的一种新协议,它实现了浏览器与服务器全双工通信(full-duplex)。

    webosocket使用HTTP请求握手,握手之后,就不再使用HTTP请求,可以在client与server之间进行数据交换时避免反复传输http headers。

     

    展开全文
  • 就是用polling函数发送11个字符出去,通过串口助手接收查看,发现有的时候,最后一个字符收不到。但是会随着下一次发送,一起打出来。 那么经过调查和请教,得知以下几点: polling会等待发送完或者超时,也就是...

    我现在遇到一个问题

    就是用polling函数发送11个字符出去,通过串口助手接收查看,发现有的时候,最后一个字符收不到。但是会随着下一次发送,一起打出来。

    那么经过调查和请教,得知以下几点:

    polling会等待发送完或者超时,也就是没有发送完成或者超时的时候不会跳出函数。

    s32k144的sdk函数处理最后一个字节的时间会比较长。

     

    对于这个问题我的临时解决方法是,发送时,多发一字节。即要发长度11的数组,写发送长度的时候写12

    那么接收端,就会收到11个字节的数据加上一个00,这样就可是保证最后字节即使丢失也可以正确的拿到数据

    展开全文
  • ceilometer polling agents源码分析

    千次阅读 2017-04-21 15:33:33
    ceilometer polling agents ceilometer数据采集polling agents 和 notification agents完成; polling agents是主动轮询所关心的数据;notification agents则是由各个模块上报数据到notificaton队列,然后...

    ceilometer polling agents源码分析


    ceilometer polling agents


    ceilometer数据采集polling agents 和 notification agents完成; polling agents是主动轮询所关心的数据;notification agents则是由各个模块上报数据到notificaton队列,然后再由ceilometer notification agents抓取队列消息进行处理;经过polling agents和notification agents处理后的数据最后会发送到notification队列,由ceilometer collector收集写入数据库或做其它处理。



    概述


    polling agent分为compute、central和ipmi三部分,分别对应不同的服务,使用同一套代码;在启动服务时,传入不同的参数(compute/central/ipmi),以此来加载对应的entry_points,实现轮询不同的pollster数据。


    tecs3.0(Openstack Mitaka)版本ceilometer总体架构


    ceilometer收集数据示意图


    ceilometer提供两种方式收集数据:

    1、从notifications队列取消息转换为ceilometer samples



    notification agents监听notification队列,除了ceilometer内部通信,nova/glance/neutron/cinder/swift/keystone/heat等都向该队列发送上报数据。Notification agents守护进程使用ceilometer.notification加载一个或多个listener插件。每一个插件可以监听任意topics,但默认监听notificaton.info。监听插件根据指定的topics抓取数据,并把它们重新发布到合适的插件(endpoints)以处理成events和samples。

    2、polling agents 以固定时间间隔通过轮询其它模块API或其它工具收集数据



    polling agent可以配置为轮询本地hypervisor或者APIs。
    计算资源的轮询是由polling compute agent处理的,它在计算节点执行(访问hypervisor更有效)。polling 通过服务API轮询非计算资源的处理是由运行在控制节点的polling central agent完成的。

    ceilometer-polling启动流程


    通过启动service时传入的参数确认启动'compute', 'central', 'ipmi'中的一个。


    pollster-list用于确认加载哪些entry_points;如果为[],则加载所有的entry_points,否则加载pollster-list对应的entry_points ceilometer\ceilometer\cmd\polling.pyCLI_OPTS = [    MultiChoicesOpt('polling-namespaces',                    default=['compute', 'central'],                    choices=['compute', 'central', 'ipmi'],                    ……),    MultiChoicesOpt('pollster-list',                    default=[],                    ……),

    ]


    def main():    service.prepare_service()    os_service.launch(CONF, manager.AgentManager(CONF.polling_namespaces,                                                 CONF.pollster_list)).wait()
    初始化操作主要实现了以下内容的操作:
    1、先根据指定参数(compute/central/ipmi)获取命名空间ceilometer.poll.compute|central|ipmi,然后获取与该命名空间相匹配的所有插件,并加载;该命名空间所指定的插件描述了如何获取采样数据;
    2、获取命名空间ceilometer.discover,获取与ceilometer.discover相匹配的所有插件,并加载;ceilometer.discover所指定的插件描述了如何发现主机上的需要监控的资源。
    ceilometer\ceilometer\agent\manager.pyclass AgentManager(service_base.BaseService):     def __init__(self, namespaces=None, pollster_list=None):         namespaces = namespaces or ['compute', 'central']         pollster_list = pollster_list or []

             ……


             #加载entry_points.txt中namespace对应插件         extensions = (self._extensions('poll', namespace).extensions                       for namespace in namespaces)

             ……


             if pollster_list:             extensions = (moves.filter(_match, exts)                           for exts in extensions)

                 ……


             self.extensions = list(itertools.chain(*list(extensions))) + list(             itertools.chain(*list(extensions_fb)))

             ……


             #获取用于polling agents处理后要发送数据的消息队列         self.notifier = oslo_messaging.Notifier(             messaging.get_transport(),             driver=cfg.CONF.publisher_notifier.telemetry_driver,             publisher_id="ceilometer.polling")

             ……


    服务启动流程代码:
    1、lanch(……) ->  ServiceLauncher -> Launcher. launch_service() -> Services.add(……)
    2、ServiceLauncher.wait() -> Launcher.restart() -> Services.restart() -> Services.run_service()
    3、调用ceilometer.agent.manager. AgentManager. start()oslo_service\service.pydef launch(conf, service, workers=1):

        ……


        if workers is None or workers == 1:        launcher = ServiceLauncher(conf)        launcher.launch_service(service)    else:        ……    return launcher……class Launcher(object):    ……    def launch_service(self, service):        ……        self.services.add(service)    ……    def restart(self):        self.conf.reload_config_files()        self.services.restart()class ServiceLauncher(Launcher):    def wait(self):        ……        while True:            ……            self.restart()        super(ServiceLauncher, self).wait()        return status……class Services(object):    def restart(self):        ……        for restart_service in self.services:            restart_service.reset()            self.tg.add_thread(self.run_service, restart_service, self.done)    @staticmethod    def run_service(service, done):        try:            service.start()

            ……


    如下代码所做的处理:
    1、读取配置文件pipeline.yaml,获取所有的sources配置。
    2、以每个meter项的interval为key创建定时任务列表,并其添加到对应采集周期的定时任务列表中。
    ceilometer\ceilometer\agent\manager.pyclass AgentManager(service_base.BaseService):

        def start(self):


            #加载pipeline.yaml文件,读取source信息        self.polling_manager = pipeline.setup_polling()

            ……


            #根据每个meter的interval创建PollingTask        self.pollster_timers = self.configure_polling_tasks()        self.init_pipeline_refresh()
    注意:因pipeline.yaml里的meter_source项的默认配置是"\*",故entry_points.txt里定义的所有采集指标都会有对应一个采集并上报原始数据任务并加入600s的任务列表里。如果不想上报原始数据,则配置项应改为:"!*"
    /etc/ceilometer/pipeline.yaml:sources:    - name: meter_source      interval: 600      meters:          - "*"      sinks:          - meter_sink

    ceilometer-polling模块定时轮询流程


    加载pipeline.yaml配置,通过interval分类创建timer,相同interval的pollster会同时触发。


    ceilometer\ceilometer\agent\manager.pyclass AgentManager(service_base.BaseService):    def configure_polling_tasks(self):

            ……


            #以interval为key创建轮询任务        data = self.setup_polling_tasks()        for interval, polling_task in data.items():

                ……


                #创建定时轮询任务            pollster_timers.append(self.tg.add_timer(interval,                                   self.interval_task,                                   initial_delay=delay_time,                                   task=polling_task))        ……    def setup_polling_tasks(self):        ……                    #以interval为key创建轮询任务                    polling_task = polling_tasks.get(source.get_interval())                    if not polling_task:                        polling_task = self.create_polling_task()                        polling_tasks[source.get_interval()] = polling_task
                        #加入轮询数据调用的方法(函数),格式见下段entry_points.txt内容                    polling_task.add(pollster, source)        return polling_tasks    def interval_task(self, task):

            ……


            #开始轮询数据        task.poll_and_notify()class PollingTask(object):    def poll_and_notify(self):                ……                try:                    #轮询获取meter数据                    samples = pollster.obj.get_samples(                        manager=self.manager,                        cache=cache,                        resources=polling_resources                    )                    for sample in samples:

                            ……


                            #将samples送到notification消息队列,由notification agents做转换后再发布                        if self._batch:                            sample_batch.append(sample_dict)                        else:                            self._send_notification([sample_dict])                    if sample_batch:                        self._send_notification(sample_batch)                ……entry_points.txt...[ceilometer.poll.compute]cpu = ceilometer.compute.pollsters.cpu:CPUPollster... 举例:下面的代码的功能是获取对应虚机的cpu使用时间。
    ceilometer\ceilometer\compute\pollsters\cpu.pyclass CPUPollster(pollsters.BaseComputePollster):    def get_samples(self, manager, cache, resources):        for instance in resources:

                try:


                    #调用libvirt接口获取cpu使用时间                cpu_info = self.inspector.inspect_cpus(instance)

                    cpu_num = {'cpu_number': cpu_info.number}


                    #生成sample并返回                yield util.make_sample_from_instance(                    instance, name='cpu',                    type=sample.TYPE_CUMULATIVE,                    unit='ns', volume=cpu_info.time,                    additional_metadata=cpu_num,                )            ……
    参考资料


    https://github.com/openstack/ceilometer/tree/stable/mitaka

    http://docs.openstack.org/developer/ceilometer/architecture.html?highlight=aodh

    展开全文
  • 漫谈 polling 和 Websocket

    2016-02-21 12:35:00
    这让服务器很为恼火:我特么才是老大,我居然不能给小弟发消息。。。 轮询 老大发火了,小弟们自然不能无动于衷,为了能及时...这便是最早实现实时获得服务器数据的技术轮询(Polling)。 客户端通过ajax不停去...

    Http被设计成了一个单向的通信的协议,即客户端发起一个request,然后服务器回应一个response。这让服务器很为恼火:我特么才是老大,我居然不能给小弟发消息。。。

    轮询

    老大发火了,小弟们自然不能无动于衷,为了能及时获得老大的消息,小弟们只好每隔一段时间跑去老大那里问问,有没有新的指示发出。这便是最早实现实时获得服务器数据的技术轮询(Polling)。

    客户端通过ajax不停去向服务器获得数据,检查是否有新的数据更新。这种使用轮询实现一种伪实时的状态很容易,但效率偏低,一般而言,这种实时获得的数据,本身数据量不是非常大,而通过这种反复地发起request的方式,往往造成的可能是http的header信息比数据本身还多,而且大多数时候获得的数据都是重复无用的。(据说最早还有通过不断刷新客户端页面,来实现web实时通信的情况~ 我想应该木有哪个客户会受得了这种体验。)

    Comet

    “不值啊!咱哥几个每天跑来跑去。拿到的都是一堆没用的数据。”

    于是大家坐在一起想,有什么好办法能不用老是跑腿又可以获得新的信息及时行动呢?小的们灵机一动,下次我们跑去老大那里等着,等他老人家下了命令再回来。这就是基于 AJAX 的长轮询(long-polling)方式实现的一种comet方式。因为ajax的调用是异步的,我们可以在页面加载完毕之后,发起一个request请求,服务器端会阻塞request直到有数据传递或超时(timeout)才返回。客户端处理完服务器返回的信息后,再次发出请求,重新建立连接。这样周而复始。

    基于 AJAX 的long-polling

    另外还有一种comet模型,他的名字玄乎比长轮询邪乎的多。。。叫The forever iframe technique。这名儿听起来就高大上很多。其实就是在页面中隐藏一个iframe标签,然后将这个iframe的 SRC 属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。但是这种方法有一个很明显的问题,各个浏览器会一直显示页面加载没有完成,如果用户是个强迫症,他一定会分分钟关掉页面的。TAT……

     forever iframe技术

    不管怎么样comet技术第一次实现了真正的实时通信,而且能支持大量用户,小的们从此总是能准确地获得老大的消息了。但是comet不会是一个没有副作用的解决方案,由于长期占用连接,让web丧失了无状态高并发的特点,大量消耗了服务器带宽和资源。

    WebSocket登场

    “跑来跑去真是麻烦诶~http肿么这么麻烦呀。咱们和老大之间整个新协议吧。”

    这个想法在小弟们中炸开了锅!!! 在大家的千呼万唤中,WebSocket协议登场了。哈哈哈哈哈~让我来拯救各位吧~~~~

    WebSocket协议是HTML5定义的一种新协议,它实现了浏览器与服务器全双工通信(full-duplex)。通过浏览器发出websocket连线请求,然后服务器发出回应,建立一个联系的通道。小的们只用发个信息问老大:“首长好~”,老大回一个信儿:“同志们辛苦了!”这样握手(handshaking)就完成了,websocket连线完成,通过websocket,我们可以完成真正的实时通信了。

    websocket允许通过JavaScript建立与远程服务器的连接,从而实现客户端与服务器间双向的通信。在websocket中有两个方法:

    1、send() 向远程服务器发送数据

    2、close() 关闭该websocket链接

    websocket同时还定义了几个监听函数

    1、onopen 当网络连接建立时触发该事件

    2、onerror 当网络发生错误时触发该事件

    3、onclose 当websocket被关闭时触发该事件

    4、onmessage 当websocket接收到服务器发来的消息的时触发的事件,也是通信中最重要的一个监听事件。

    websocket还定义了一个readyState属性,这个属性可以返回websocket所处的状态:

    1、CONNECTING(0) websocket正尝试与服务器建立连接

    2、OPEN(1) websocket与服务器已经建立连接

    3、CLOSING(2) websocket正在关闭与服务器的连接

    4、CLOSED(3) websocket已经关闭了与服务器的连接

    websocket的url开头是ws,如果需要ssl加密可以使用wss,当我们调用websocket的构造方法构建一个websocket对象(new WebSocket(url))的之后,就可以进行即时通信了。

    哈哈哈哈哈哈~老大通过websocket发话了:晚上请吃饭!

    小弟们赶紧行动起来~

    总结

    相比comet技术,websocket不仅节约了header的问题(websocket的head信息只有短短的2个字节)。更加重要的是是通信的稳定性,comet在遇到网络问题之后,想要在不刷新页面的情况下恢复通信,非常困难,而websocket中提供了onclose函数来处理断开网络后的情况,这为我们与服务器的通信提供了可靠的保障。在github上有一个js库(https://github.com/joewalnes/reconnecting-websocket)就是通过这种方式来处理websocket断网重连。

    websocket看起来广泛实现只是时间问题了,当然这么好用的websocket也不是没有它的问题,websocket目前来看最大的问题是浏览器的支持(幸好大部分的服务器软件在比较新的版本中都已经支持了websocket),ie直到10才开始支持这种协议,而且每个浏览器最近在升级浏览器的时候,都会对websocket做出细微的调整。而且,想象你打开一个页面,当这个页面打开websocket连接并且执行一个内部IP地址的端口扫描,如果端口扫描发现了内部网络上发现了一个开启的80端口,一个隧道就可能通过你的浏览器建立。这样做很可能最终绕过防火墙,并且允许访问内部内容。所以安全问题,也是websocket现在面临的一大隐患。

    展开全文
  • IO-Polling的代码分析

    2017-08-03 08:10:00
    在前一篇文章《IO-Polling实现分析与性能评測》中提到了IO-Polling与中断的原理差别,并通过两种模式下NVMe SSD的性能測试对两者进行了对照。这篇文章将深入到IO-Polling的代码层面,对这一IO处理模式进行一个解读。...
  • polling到Websocket

    千次阅读 2014-06-28 16:48:32
     ...这让服务器很为恼火:我特么才是老大,我居然不能给小弟发消息。。。 ... 老大发火了,小弟们自然不能无动于衷,为了能及时获得老大的...这便是最早实现实时获得服务器数据的技术轮询(Polling)。  客户端通
  • 前面我们已经学习了TCP的所有发送、接收和各种回调函数。本文将介绍最后一部分,TCP的轮询机制。 在前面TCP发送Hello World的实例中,我们是在main函数的while循环中每隔1s调用一次数据发送函数。本文的实例将利用...
  • KVM halt-polling机制分析

    2018-12-13 22:16:35
    本文由作者朱益军授权网易云社区发布。...KVM halt polling特性就是为了解决这一个问题被引入的,它在Linux 4.3-rc1被合入主干内核,其基本原理是当guest idle发生vm-exit时,host 继续polling一段时...
  • ext direct spring Polling Method

    千次阅读 2013-09-09 15:52:41
    Server   ExtDirectSpring支持轮询服务(POST)和(GET)参数。...这个方法必须是一个Spring管理的bean的成员函数。event属性是事件的名称。如果一个轮询方法需要支持参数,参数需要添加注释@Req
  • 2.前端消息通信的使用之前文章已经记录过,说一下前后端消息机制longpolling的使用 (1).前端部分: this.call('bus_service', 'addChannel', 'menu_badge'); this.call('bus_service', 'onNotification', self, this._...
  • React WebSocket Polling(实时推送)

    千次阅读 2018-03-07 23:20:51
    老徐Sunday, 7 March 2018 本文假设你对 React 已经比较...React WebSocket Polling React 程序使用 WebSocket 获取实时推送数据 基础 实时数据推送 在Web或移动项目中,服务器向客户端实时推送消息是一种常见的业务...
  • 开发环境: 硬件:MPC5748G 软件:S32 Design Studio for Power Architecture Version 2017.R1 ...需要在中断向量表中配置中断函数 b.初始化中断寄存器PSR c.使能adc转换中断 遇到的问题: EO...
  • 开发环境: 硬件:MPC5748G 软件:S32 Design Studio for Power Architecture Version 2017.R1 can引脚: ...需要在中断向量表中配置中断函数 b.初始化中断寄存器PSR c.使能can接收发送中断 遇到的...
  • 长轮询Long Polling的通俗解释

    千次阅读 2015-03-20 18:17:34
    polling这个词也生动的形容了这个的状态。就像这样: 轮询如果是排队买东西,那么长轮询就是排队上厕所。买东西的话,丢下钱就可以拿东西走了,但是上厕所就不一样,有些人说不定便秘半个小时都出不来。如果...
  • 开发环境: 硬件:MPC5748G 软件:S32 Design Studio for Power Architecture Version 2017.R1 ...需要在中断向量表中配置中断函数 b.初始化中断寄存器PSR c.使能串口接收发送中断 3.然后就可以...
  • 这让服务器很为恼火:我特么才是老大,我居然不能给小弟发消息。。。 轮询  老大发火了,小弟们自然不能无动于衷,为了能及时...这便是最早实现实时获得服务器数据的技术轮询(Polling)。  客户端通过aja...
  • 轮询(Polling)是一种CPU决策如何提供周边设备服务的方式,又称“程控输出入”(Programmed I/O)。轮询法的概念是,由CPU定时发出询问,依序询问每一个周边设备是否需要其服务,有即给予服务,服务结束后再问下一...
  • 如图 1所示,AJAX 的出现使得 JavaScript 可以调用 XMLHttpRequest 对象发出 HTTP 请求,JavaScript 响应处理函数根据服务器返回的信息对 HTML 页面的显示进行...客户端 JavaScript 响应处理函数会在处理完服务器...
  • 开发环境: 硬件:MPC5748G 软件:S32 Design Studio for Power Architecture Version 2017.R1 外设:24LC256 I2C引脚: PE8 ...需要在中断向量表中配置中断函数 b.初始化中断寄存器PSR c.使能I2C...
  • 需要在中断向量表中配置中断函数 b.初始化中断寄存器PSR c.使能spi接收发送中断 遇到的问题: 使用自带SPI的CS片选,从初始化开始,CS就一直为低电平 推荐使用GPIO做CS片选 在使用从机模式时,我使用了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,174
精华内容 4,869
关键字:

polling函数