zoukankan      html  css  js  c++  java
  • PostgreSQL的notify 与listen (七)

    磨砺技术珠矶,践行数据之道,追求卓越价值

    回到上一级页面: PostgreSQL基础知识与基本操作索引页     回到顶级页面:PostgreSQL索引页

    接PostgreSQL的notify 与listen (六)的内容,探讨一下谁真正接受notify 消息。

    修改PostgreSQL的源代码:src/backend/command/async.c:
    NotifyMyFrontEnd(const char *channel, const char *payload, int32 srcPid)函数

    if (whereToSendOutput == DestRemote)
    {
        StringInfoData buf;
        pq_beginmessage(&buf, 'A');
        pq_sendint(&buf, srcPid, sizeof(int32));
        pq_sendstring(&buf, channel);
        if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3)
            pq_sendstring(&buf, payload);
        pq_endmessage(&buf);                
                                
        //added by gaojian begin
        elog(WARNING, "NotifyMyFrontEnd, srcPid is: %d", srcPid);  
    elog(WARNING, "NotifyMyFrontEnd, my Pid is: %d", getpid());

    //added by gaojian end
        ......
    }

    启动 postgres, 执行 ps -ef|grep postgres

    开session A(用作listen 端), psql:
    
    postgres#listen gaojian;
    postgres#

    再来看 ps -ef|grep postgre: 进程号27764/父进程号27695的 名为postgres的进程已启动。

    开session B(用作notify 端),psql:
    postgres#notify gaojian;
    postgres#

    再来看 ps -ef|grep postgre: 进程号27857/父进程号27695 的 名为postgres的进程已启动。

    再回到session A, 随便执行一条命令:

    postgres#select current_date;
    警告 In NotifyMyFrontEnd srcPid is 27857
    警告 In NotifyMyFrontEnd my Pid is 27764
    -----date-----
    2012-07-13 收到来自伺服器 "gaojian" 进程PID 27875 非同步通知 postgres#

    这表明 信息的发送者实际上是 和notify 端对应的 后台postgres进程。信息的接受者首先也是和listen端对应的后台postgres进程,由此进程把消息推送给 前台psql(listen端)。

    回到上一级页面: PostgreSQL基础知识与基本操作索引页     回到顶级页面:PostgreSQL索引页

    磨砺技术珠矶,践行数据之道,追求卓越价值

  • 相关阅读:
    安装django时出错
    mysql ------python3(一)笔记
    安装mysql的具体过程
    Python3web框架---Django、Tornado、Flask的对比
    python3-----json函数
    图片人脸识别年龄和性别
    urllib库的使用(三)-----python3 异常处理
    python 3 基础篇 (一)
    requests,pymysql,django的安装
    求素数方法的改进
  • 原文地址:https://www.cnblogs.com/gaojian/p/2590430.html
Copyright © 2011-2022 走看看