NotifyMyFrontEnd 函数背后的数据缓冲区(二)

简介:
message level 函数pq_putmessage调用 low level 函数 pq_putbytes,
pq_putbytes调用 internal_putbytes。

从internal_putbyes上来看,就可以发现其数据发送的机制:
有一个小技巧,如果数据缓冲区满了,就发送,否则就先堆在那儿。
如果原有数据+本次数据量大于数据缓冲去大小那就分多次循环发送。

复制代码
internal_putbytes(const char *s, size_t len) 
{    
   size_t     amount;    
   while (len > 0)    
   {    
      /* If buffer is full, then flush it out */    
      if (PqSendPointer >= PQ_BUFFER_SIZE)    
           if (internal_flush())    
                return EOF;

      amount = PQ_BUFFER_SIZE - PqSendPointer;
      ......

   }    
   return 0;    
复制代码
但是,我还有一个疑问:客户端和服务器端可是需要及时响应的呀,不可能一直等缓冲区满才发生 internal_flush吧。

再研究代码发现,pqcomm.c 中还有 pq_flush函数,它被调用的时候,就会立即调用 internal_flush。

可以简单总结:
服务器端完成了客户端的请求后,为向客户端反馈,
会经过某些函数(如pq_putmessage),走到调用 internal_putbytes的步骤;
然后返回,接着再调用pq_flush函数(内部调用internal_flush,这将导致向客户端发生网络通信)。

当调用internal_putbytes时,若信息量已经大于缓冲区大小,则此时也需要调用internal_flush。







本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/07/17/2595112.html,如需转载请自行联系原作者
目录
相关文章
|
Shell
在Shell脚本或命令行中,标准错误输出
在Shell脚本或命令行中,标准错误输出
1090 1
|
人工智能 搜索推荐 机器人
OpenAI 将向企业开放 GPT-4o 模型定制版,国内怎么使用ChatGPT?
OpenAI新推功能让企业客户能定制GPT-4o模型,通过微调技术满足特定需求和业务场景,以前所未有的方式优化AI投资回报。企业上传自有数据后,可在一到两小时内完成模型定制,如滑板公司打造专业客服聊天机器人解答详细问题,大幅提升服务针对性与客户体验。目前定制限于文本数据,但仍显著增强了企业应用AI的灵活性与效率。
325 2
OpenAI 将向企业开放 GPT-4o 模型定制版,国内怎么使用ChatGPT?
|
程序员 编译器 数据处理
汇编高手秘籍:解锁性能优化新境界,用汇编语言让你的程序飞起来!
【8月更文挑战第31天】汇编语言作为编程基石,其高效性能备受推崇。尽管现代软件开发更偏爱高级语言,但在性能要求极高的场景下,汇编优化仍不可或缺。本文通过示例代码介绍四种优化技巧:循环展开、寄存器分配、指令重排及SIMD指令使用,显著提升执行效率。同时强调分析性能瓶颈、测试优化效果及保持代码可读性的重要性,助力开发者在关键代码路径上实现性能突破。
619 0
|
存储 SQL 弹性计算
Hologres V2.1版本发布,新增计算组实例构建高可用实时数仓
新增弹性计算组实例,解决实时数仓场景下分析性能、资源隔离、高可用、弹性扩缩容等核心问题,同时新增多种用户分析函数与实时湖仓Paimon格式支持,COUNT DISTINCT优化显著提升查询效率。
|
SQL 分布式计算 大数据
Paimon 与 Spark 的集成(二):查询优化
通过一系列优化,我们将 Paimon x Spark 在 TpcDS 上的性能提高了37+%,已基本和 Parquet x Spark 持平,本文对其中的关键优化点进行了详细介绍。
119023 30
|
消息中间件 存储 负载均衡
RocketMQ消费者消费消息核心原理(含长轮询机制)
这篇文章深入探讨了Apache RocketMQ消息队列中消费者消费消息的核心原理,特别是长轮询机制。文章从消费者和Broker的交互流程出发,详细分析了Push和Pull两种消费模式的内部实现,以及它们是如何通过长轮询机制来优化消息消费的效率。文章还对RocketMQ的消费者启动流程、消息拉取请求的发起、Broker端处理消息拉取请求的流程进行了深入的源码分析,并总结了RocketMQ在设计上的优点,如单一职责化和线程池的使用等。
RocketMQ消费者消费消息核心原理(含长轮询机制)
|
存储 Shell Linux
Linux(25) 如何解决Linux终端乱码问题
Linux(25) 如何解决Linux终端乱码问题
451 1
|
存储 运维 Oracle
Oracle系列十八:Oracle RAC
Oracle系列十八:Oracle RAC
2108 0