[PHP] 多进程通信-消息队列使用

向消息队列发送数据和获取数据的测试

<?php
$key=ftok(__FILE__,‘a‘);

//获取消息队列
$queue=msg_get_queue($key,0666);
//发送消息
//msg_send($queue, 1, "Hello, 1");
//接收消息,如果接收不到会阻塞
msg_receive($queue, 1, $message_type, 1024, $message1);
//移除消息
//msg_remove_queue($queue);
//var_dump($message1);

<?php
/**
 * 这段代码模拟了一个日常的任务。
 * 第一个父进程产生了一个子进程。子进程又作为父进程,产生10个子进程。
 * 可以简化为A -> B -> c,d,e... 等进程。
 * 作为A来说,只需要生产任务,然后交给B 来处理。B 则会将任务分配给10个子进程来进行处理。
 *
 */

//设定脚本永不超时
set_time_limit(0);
$ftok = ftok(__FILE__, ‘a‘);
$msg_queue = msg_get_queue($ftok);
$pidarr = []; 

//产生子进程
$pid = pcntl_fork();
if ($pid) {
    //父进程模拟生成一个特大的数组。
    $arr = range(1,100000);
    //将任务放进队里,让多个子进程并行处理
    foreach ($arr as $val) {
        $status = msg_send($msg_queue,1, $val);
        usleep(1000);
    }
    $pidarr[] = $pid;
    msg_remove_queue($msg_queue);
} else {
    //子进程收到任务后,fork10个子进程来处理任务。
    for ($i =0; $i<10; $i++) {
        $childpid = pcntl_fork();
        if ($childpid) {
            $pidarr[] = $childpid; //收集子进程processid
        } else {
            while (true) {
                msg_receive($msg_queue, 0, $msg_type, 1024, $message);
                if (!$message) exit(0);
                echo $message.PHP_EOL;
                usleep(1000);
            }
        }
    }
}

//防止主进程先于子进程退出,形成僵尸进程
while (count($pidarr) > 0) {
    foreach ($pidarr as $key => $pid) {
        $status = pcntl_waitpid($pid, $status);
        if ($status == -1 || $status > 0) {
            unset($pidarr[$key]);
        }
    }
    sleep(1);
}

原文地址:https://www.cnblogs.com/taoshihan/p/9991780.html

时间: 2024-10-07 18:48:47

[PHP] 多进程通信-消息队列使用的相关文章

day41——多进程的消息队列、消息队列pipe

多进程的消息队列 消息队列指的是消息在传输过程中保存消息的容器 消息队列最经典的用法是消费者和生产者之间通过消息管道来传递消息.消费者和和生产者是不同的进程,生产者往管道中写消息,消费者从管道中读消息 multiprocessing模块提供了Queue类 和 Pipe函数 实现消息队列 1. Queue 用法: In [1]: import multiprocessing In [2]: help(multiprocessing.Queue) Help on function Queue in

【Linux】 进程通信--消息队列

一.概念 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值.我们可以通过发送消息 来避免命名管道的同步和阻塞问题.消息队列与管道不同的是,消息队列是基于消息的, 而管道是基于字节流的,且消息队列的读取不?定是先入先出.消息队列与命名管道有一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有?个上限(MSGMNI). 查看机

41. Python Queue 多进程的消息队列 PIPE

消息队列: 消息队列是在消息传输过程中保存消息的容器. 消息队列最经典的用法就是消费者和生产者之间通过消息管道来传递消息,消费者和生产生是不通的进程.生产者往管道中写消息,消费者从管道中读消息. 相当于水管,有一个入口和出口,水从入口流入出口流出,这就是一个消息队列 线程或进程往队列里面添加数据,出口从队列里面读数据 左侧多线程往入口处添加完数据,任务就结束了:右侧只要依次从水管里取数据就行了. 异步完成的任务 比如京东下单,下单后付完钱,相当于把消息堆在了水管里,后台会有线程去接收这个单的消息

python—多进程的消息队列

消息队列 消息队列是在消息的传输过程中保存消息的容器 消息队列最经典的用法就是消费者 和生产者之间通过消息管道传递消息,消费者和生成者是不同的进程.生产者往管道写消息,消费者从管道中读消息 操作系统提供了很多机制来实现进程间的通信,multiprocessing模块提供了Queue和Pipe两种方法来实现 一.使用multiprocessing里面的Queue来实现消息队列 q = Queue q.put(data) data = q.get() 例子: from multiprocessing

μC/OS-II 任务的同步与通信 --- 消息队列

简介 使用消息队列可以在任务之间传递多条消息.消息队列由三个部分组成:事件控制块.消息队列和消息. 当把事件控制块成员 OSEventType 的值置为 OS_EVENT_TYPE_Q 时,该事件控制块描述的就是一个消息队列. 消息队列相当于一个共用一个任务等待列表的消息邮箱数组,事件控制块成员 OSEventPtr 指向了一个叫做队列控制块(OS_Q)的结构,该结构管理了一个数组 MsgTbl[ ],该数组中的元素都是一些指向消息的指针. 消息队列的数据结构 其中,可以移动的指针为 OSQIn

linux内核---进程通信---消息队列

转自:https://blog.csdn.net/ljianhui/article/details/10287879 原文地址:https://www.cnblogs.com/qing1991/p/10182521.html

进程间通信之消息队列通信

概念 消息队列 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 消息队列也有管道一样的不足,就是每条消息的最大长度是有上限的(MSGMAX),每个消息队列的总字节数(内核缓冲上限)是有上限的(MSGMNB),系统上消息队列的总数(消息条目数)也有一个上限(MSGMNI) 对比: 管道 消息 流管道 有边界 先进先出 可以后进入.先出来 消息大小三大限制 cat /proc/sys/kernel/msgmax最

【进程编程】——msg进程间的消息队列通信

           [进程编程]--msg进程间的消息队列通信 消息队列就像一个链表,先进先出,就像排队打饭,先到先买!键值 用来获取消息队列的描述字,我感觉就像是一个定位标识符! 函数一     key_t ftok(char *pathname,char proj)返回的是一个键值------>创建队列之前一定要获取这个键值!proj:项目名,不为零即可 打开.创建函数二     int msgget(key_t key,int msgflg) //看见没,这里是要求键值的. key:键值

基于System V Message queue的PHP消息队列封装

原创文章,转载请注明出处:http://www.huyanping.cn/?p=235 作者:Jenner System V Message queue 是一种进程通信(IPC)的方式,方便实现生产者-消费者模型,单个或多个生产者向队列中写入消息,多个生产者再从队列中获取消息进行处理. 项目地址:https://github.com/huyanping/Zebra-PHP-Framework 该Wrapper支持: 进程通信 设置最大队列容量(字节单位) 获取当前队列数量 修改队列部分属性 注意