画江湖之 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 协议》,转载必须注明作者和本文链接
怎么限制数量的,没明白