画江湖之 PHP 多进程开发 [通过信号量控制并发量]

信号量解决的问题

  • 例如IO密集型操作,开启了30个工作线程并发的读取文件,然后进行持久化操作,但是数据库最大连接数为20,如果不控制,就出现获取数据库连接失败错误,通过Semaphore控制并发连接数据库线程数

信号量函数

sem_get         得到一个信号量 id
sem_acquire     获取一个信号量
sem_release     释放一个信号量
sem_remove      移除一个信号量

代码演示 一个进程

<?php

$key = 123456;

$resource = sem_get($key);//得到一个信号量id

if ( false === $resource ) {//如果没得到 就失败了
    die("Get sem failed\n");
}

// 获取信号量
if (sem_acquire($resource)) {//获取这个信号量
    echo "Sem acquire success\n";
    echo "Doing something ...\n";//处理业务逻辑
    // 释放信号量, 使其它程序可以获取该信号量
    sem_release($resource);
    sleep(10);
}

echo "Done\n";

代码演示 另一个进程

<?php

$key = 123456;

$resource = sem_get($key);

if ( false === $resource ) {
    die("Get sem failed\n");
}

while (true) {
    // 获取信号量
    if (sem_acquire($resource)) {
        echo "Sem acquire success\n";
        echo "Doing something ...\n";
        break;
    }
}

sem_remove($resource);//移除信号量

echo "Done\n";
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1
wenqingzzz

怎么限制数量的,没明白

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!