多进程网状通信(消息队列)

消息队列(MQ)——massage quene
在这里插入图片描述

生产者:写入数据到消息队列

消费者:从消息队列拿数据用

在这里插入图片描述

为什么要用消息队列呢?

三个方面(三个优点)
1.解耦

  • 假设A开始与B连接,然后出现其他原因后要与A断开然后与C连接,这时候A必须修改代码来连接C,等过一段时间之后又发现C连接不上要改成连接B这时候又要修改代码,等再过一段时间后A又要与DEF相连接,这时候修改代码就会非常麻烦。通过消息队列的方法就渐变多了。
    A变成生产者往消息队列里面发送数据,然后BCDE当作消费者在消息队列里面提取数据,就方便很多啦!

2.异步

  • 首先,什么是异步呢? 异步就是把一件事拆分成几件小事然后交给几个人一起去执行从而提高生产效率。
    假设有这样一个案例,假设一个人去面试海康,然后面试通过了,这时候海康系统要做三件事,第一件事情:确认面试通过,第二件事:发邮件给当事人告知面试通过,第三件事:发短信给当事人告知面试通过。
    这时候如果用一步一步走的话,耗时就会很长,当我们走完第一步后通过异步的方式同时进行第二步和第三步,就会快很多。这时候生产者确认面试通过后将数据放入消息队列,第二步和第三步从作为消费者中提取数据同时执行。

3.削峰

  • 消息队列又是如何完成削峰的呢?好比如你现在有两台机器,每台只能处理100个请求,那预估业务会来1000个请求你怎么办?削峰!把请求的流量高峰削掉,每台机器处理了100个请求,剩下800个请求先放到消息队列中,等机器根据自己处理请求的能力去消息队列去拿。
``c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include<stdio.h>
#include<stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#define LUJING "./file1"
#include<string.h>
int msgpid_creat(void)
{
        key_t key=-1;
        int fd=0;
        int msgpid=-1;
        /*创建一个消息队列的专用文件,ftok会用到这个文件的路径名*/
        fd=open(LUJING,O_RDWR|O_CREAT,0664);
        if(fd==-1)
        {
                printf("文件打开失败!\n");
        }
        /*利用存在的文件路径名和8位整形数计算出key*/
        key=ftok(LUJING,'a');
        if(key==-1)
        {
                printf("ftok失败!\n");
        }
        /*利用key创建、或者获取消息队列*/
        msgpid=msgget(key,IPC_CREAT|0664);
//      printf("msgpid=%d\n",msgpid);   
        return msgpid;

}
struct msgbuf
{
        long mtype;
        char metext[1024];

};
int main(int argc,char **argv)
{
        int ret =-1;
        int msgpid= msgpid_creat();
        long recv =0;
        ret =fork();
        if(argc!=2)
        {

                printf("Error!\n");
                exit(-1);
        }
        recv=atol(argv[1]);
        if(ret>0)//发送消息
        {
                struct msgbuf msg_buf={0};
                while(1)
                {
//                       void bzero(void *s, size_t n);

                        bzero(&msg_buf,sizeof(msg_buf));//清空msg_buf

                        scanf("%s",msg_buf.metext);//获取输入内容
                        printf("input send_msgtype:\n");
                        scanf("%ld",&(msg_buf.mtype));

                 // int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
                        msgsnd(msgpid,&msg_buf,1024,0);//发送消息
                }
        }
        else if (ret==0)//接受消息
        {
                struct msgbuf msg_buf={0};
                int ret =0;
                while(1)
                {
//               ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
                        bzero(&msg_buf,sizeof(msg_buf));
                        ret=msgrcv(msgpid,&msg_buf,1024,recv,0);
                        if(ret>0)
                        {
                                printf("%s\n",msg_buf.metext);
                        }
                }
        }
        return 0;
}
~  
                                       

来看一下运行结果


![在这里插入图片描述](https://img-blog.csdnimg.cn/20210328205416208.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNDgyNzkw,size_16,color_FFFFFF,t_70)


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大家好我是覃同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值