一个进程如果是个人英雄主义,那么多进程就是集体主义。(不严格区分多进程 和 多线程的差别)

你不再是一个独行侠,而是一个指挥家。

独来独往,非常自由自在,但是,很多时候,不如众人拾柴火焰高。

这就是我对多进程的理解。多线程编程的主要问题是:通信 和 同步问题。

更多PHP 多线程编程的背景知识见:

PHP多进程编程(一)

在PHP 中,如果光用pcntl ,实现比较简单的通信问题都是很困难的。

下面介绍管道通信:

1. 管道可以认为是一个队列,不同的线程都可以往里面写东西,也都可以从里面读东西。写就是

在队列末尾添加,读就是在队头删除。

2. 管道一般有大小,默认一般是4K,也就是内容超过4K了,你就只能读,不能往里面写了。

3. 默认情况下,管道写入以后,就会被阻止,直到读取他的程序读取把数据读完。而读取进程也会被阻止,

直到有进程向管道写入数据。当然,你可以改变这样的默认属性,用stream_set_block  函数,设置成非阻断模式。

下面是我分装的一个管道的类(这个类命名有问题,没有统一,没有时间改成统一的了,我一般先写测试代码,最后分装,所以命名上可能不统一):

<?php
class Pipe
{
public $fifoPath;
private $w_pipe;
private $r_pipe; /**
* 自动创建一个管道
*
* @param string $name 管道名字
* @param int $mode 管道的权限,默认任何用户组可以读写
*/
function __construct($name = 'pipe', $mode = )
{
$fifoPath = "/tmp/$name." . posix_getpid();
if (!file_exists($fifoPath)) {
if (!posix_mkfifo($fifoPath, $mode)) {
error("create new pipe ($name) error.");
return false;
}
} else {
error( "pipe ($name) has exit.");
return false;
}
$this->fifoPath = $fifoPath;
} ///////////////////////////////////////////////////
// 写管道函数开始
///////////////////////////////////////////////////
function open_write()
{
$this->w_pipe = fopen($this->fifoPath, 'w');
if ($this->w_pipe == NULL) {
error("open pipe {$this->fifoPath} for write error.");
return false;
}
return true;
} function write($data)
{
return fwrite($this->w_pipe, $data);
} function write_all($data)
{
$w_pipe = fopen($this->fifoPath, 'w');
fwrite($w_pipe, $data);
fclose($w_pipe);
} function close_write()
{
return fclose($this->w_pipe);
}
/////////////////////////////////////////////////////////
/// 读管道相关函数开始
////////////////////////////////////////////////////////
function open_read()
{
$this->r_pipe = fopen($this->fifoPath, 'r');
if ($this->r_pipe == NULL) {
error("open pipe {$this->fifoPath} for read error.");
return false;
}
return true;
} function read($byte = )
{
return fread($this->r_pipe, $byte);
} function read_all()
{
$r_pipe = fopen($this->fifoPath, 'r');
$data = '';
while (!feof($r_pipe)) {
//echo "read one K\n";
$data .= fread($r_pipe, );
}
fclose($r_pipe);
return $data;
} function close_read()
{
return fclose($this->r_pipe);
}
////////////////////////////////////////////////////
/**
* 删除管道
*
* @return boolean is success
*/
function rm_pipe()
{
return unlink($this->fifoPath);
}
}
?>

有了这个类,就可以实现简单的管道通信了,因为这个教程是多进程编程系列教程的一个部分。

这个管道类的应用部分,将放到第三部分。

PHP多进程编程(2):管道通信的更多相关文章

  1. Python 多进程编程之 进程间的通信(在Pool中Queue)

    Python 多进程编程之 进程间的通信(在Pool中Queue) 1,在进程池中进程间的通信,原理与普通进程之间一样,只是引用的方法不同,python对进程池通信有专用的方法 在Manager()中 ...

  2. Python 多进程编程之 进程间的通信(Queue)

    Python 多进程编程之 进程间的通信(Queue) 1,进程间通信Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法----这是操作系统开辟 ...

  3. windows10使用VS(VC++)创建c++多进程命名管道通信

    代码可以在 这里 下载 代码主要涉及到: 管道通信 多线程(含临界区) 多进程通信 创建的子进程独立运行 更新日志: 04-12-2020 1. 去除自定义函数返回值,改为int作为函数返回值并增加相 ...

  4. Python多进程编程

    转自:Python多进程编程 阅读目录 1. Process 2. Lock 3. Semaphore 4. Event 5. Queue 6. Pipe 7. Pool 序. multiproces ...

  5. Linux下的多进程编程

    1.进程 1.1进程的定义 <计算机操作系统>这门课对进程有这样的描述:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统 ...

  6. Linux高性能server规划——多进程编程

    多进程编程 多进程编程包含例如以下内容: 复制进程影映像的fork系统调用和替换进程映像的exec系列系统调用. 僵尸进程以及怎样避免僵尸进程 进程间通信(Inter-Process Communic ...

  7. 【转】Python多进程编程

    [转]Python多进程编程 序. multiprocessingpython中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Pytho ...

  8. python学习笔记——multiprocessing 多进程组件 Pipe管道

    进程间通信(IPC InterProcess Communication)是值在不同进程间传播或交换信息. IPC通过有管道(无名管道 和 有名 / 命名管道).消息队列.共享存储 / 内容.信号量. ...

  9. 多进程编程——理论讲解与 multiprocessing 模块

    多进程编程 import os pid = os .fork() 功能 :创建新的进程 参数: 无 返回值 :失败返回一个负数 成功:在原有进程中返回新的进程的PID号 在新进程中返回为0* 子进程会 ...

随机推荐

  1. asp与aspx有什么区别

    asp与aspx哪个好? 最佳答案 你如果想知道哪个好,我想很多人第一个想法就是aspx好. 这很好理解,就像楼上的朋友说的,aspx是asp的升级版. 但是aspx相对于asp的升级可以说是从根本上 ...

  2. SQL语法 之 表连接

    一.连接条件 连接查询中用来连接连个表的条件称为连接条件或连接谓词.其形式为: [<表1>].<列名1> <连接运算符> [<表2>].<列2&g ...

  3. 【转】使用python进行多线程编程

    1. python对多线程的支持 1)虚拟机层面 Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,暂时无法利用多处理器的优势.使 ...

  4. MySQL联合多表更新和删除

    多表更新 在 MySQL 3.23 中,你能够使用 LIMIT # 来确保仅仅有给定的记录行数目被更改. 假设一个 ORDER BY 子句被使用(从 MySQL 4.0.0 開始支持),记录行将以指定 ...

  5. solr学习(一)

    1.搭建solr环境 1.1 下载solr安装包,下载地址:http://lucene.apache.org/solr/mirrors-solr-latest-redir.html 下载并解压 1.2 ...

  6. Java 同步器

    CyclicBarrier是什么 CyclicBarrier也叫同步屏障,在JDK1.5被引入,可以让一组线程达到一个屏障时被阻塞,直到最后一个线程达到屏障时,所以被阻塞的线程才能继续执行.Cycli ...

  7. windows合并文件夹窗口

      windows合并文件夹窗口 CreateTime--2017年7月26日16:28:14Author:Marydon 右击任务栏-->属性-->任务栏按钮选项-->选择“始终合 ...

  8. ORACLE判断两个日期间隔几个工作日

      CreateTime--2017年9月7日17:14:56 Author:Marydon ORACLE判断两个日期间隔几个工作日 方法:使用存储过程 /** * 判断两个日期间隔几个工作日 */ ...

  9. 线程间操作无效: 从不是创建控件“txtreceive”的线程访问它。

    自己在写串口通信的时候遇到个这样的问题 自己是用vs2010  c#写的错误提示是这样的“线程间操作无效: 从不是创建控件“txtreceive”的线程访问它.”  用的控件是自带的serialPor ...

  10. ubuntu下载软件安装包

    apt-get -d download xxx ubuntu下载软件安装包命令.仅仅下载deb格式的安装包,不安装. xxx是待下载的安装包.