swoole之创建子进程
一、代码
<?php /**
* 进程就是正在运行的程序的一个实例
* 比如,在某个终端中执行一个PHP脚本,可以认为就是开启了一个进程,会有对应的进程id(pid)
*
* swoole进程与进程之间是通过管道通信
*/ /**
* 执行process.php 创建子进程$pid 子进程创建http_server
*
* php(11440,主进程)───php(11441,子进程)─┬─php(11442,manager进程)─┬─php(11444,worker进程)
* │ ├─php(11445)
* │ ├─php(11446)
* │ └─php(11447)
* └─{php}(11443)
*/ $process = new swoole_process(function (swoole_process $worker) {
// 执行 php http.php 开启http服务器
$worker->exec("/usr/local/php71/bin/php", [__DIR__.'/../server/http.php']);
}, true); $pid = $process->start();
echo $pid.PHP_EOL; swoole_process::wait(); /**
* 模拟爬取多个网站的数据场景
*/
$urls = [
'http://www.helloweba.net/php/576.html',
'http://www.helloweba.net/php/580.html',
'http://www.helloweba.net/php/581.html'
]; $workers = []; echo 'process start: '.date('Y-m-d H:i:s').PHP_EOL; for ($i=0; $i<count($urls); $i++) {
$url = $urls[$i];
$process = new swoole_process(function (swoole_process $worker) use ($url) {
$content = curlData($url);
// echo $content.PHP_EOL;
$worker->write($content);
}, true);
$pid = $process->start();
$workers[$pid] = $process;
} foreach ($workers as $process) {
echo $process->read();
} /**
* 简化模拟请求
* @param [type] $url
* @return void
*/
function curlData($url)
{
sleep(1);
return "get {$url} content success".PHP_EOL;
} echo 'process end: '.date('Y-m-d H:i:s').PHP_EOL; /*
输出数据,用时1秒(多进程执行)而不是3秒:
process start: 2019-05-05 18:02:42
get http://www.helloweba.net/php/576.html content success
get http://www.helloweba.net/php/580.html content success
get http://www.helloweba.net/php/581.html content success
process end: 2019-05-05 18:02:43
*/


swoole之创建子进程的更多相关文章
- fork()创建子进程
fork()系统调用是Unix下以自身进程创建子进程的系统调用,一次调用,两次返回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程的pid) 在fork()的调用处,整个父 ...
- Nginx学习笔记(七) 创建子进程
Nginx创建子进程 ngx_start_worker_processes位于Nginx_process_cycle.c中,主要的工作是创建子进程. 在Nginx中,master进程和worker进程 ...
- [转载]Python模块学习 ---- subprocess 创建子进程
[转自]http://blog.sciencenet.cn/blog-600900-499638.html 最近,我们老大要我写一个守护者程序,对服务器进程进行守护.如果服务器不幸挂掉了,守护者能即时 ...
- windows、linux创建子进程
在windows下创建子进程较常用到的API就是CreateProcess,可以通过以下的方式启动一个新进程: STARTUPINFO si = {0}; PROCES ...
- Linux 创建子进程执行任务
Linux 操作系统紧紧依赖进程创建来满足用户的需求.例如,只要用户输入一条命令,shell 进程就创建一个新进程,新进程运行 shell 的另一个拷贝并执行用户输入的命令.Linux 系统中通过 f ...
- exec族函数详解及循环创建子进程
前言:之前也知道exec族函数,但没有完全掌握,昨天又重新学习了一遍,基本完全掌握了,还有一些父子进程和循环创建子进程的问题,还要介绍一下环境变量,今天分享一下. 一.环境变量 先介绍下环境的概念和特 ...
- 利用fork创建子进程
创建如图的进程: #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<wait. ...
- JAVA创建子进程并处理waitFor() 阻塞问题
虽然很想休息,但是想想还是要把今天学的东西记下来,不然以后再用还是新知识. 新建一个线程类读取子进程的汇报信息和错误信息,避免阻塞 class StreamGobbler extends Thread ...
- 第二十篇:不为客户连接创建子进程的并发回射服务器(poll实现)
前言 在上文中,我使用select函数实现了不为客户连接创建子进程的并发回射服务器( 点此进入 ).但其中有个细节确实有点麻烦,那就是还得设置一个client数组用来标记select监听描述符集中被设 ...
随机推荐
- 指令——mdadm
Mdadm命令详解 Linux内核中有一个md(multiple devices)模块在底层管理RAID设备,它会在应用层给我们提供一个应用程序的工具mdadm ,mdadm是linux下用于创建和管 ...
- linux mysql 查看数据库大小
SELECT CONCAT(TRUNCATE(SUM(data_length)//,),'MB') AS data_size, CONCAT(TRUNCATE(SUM(max_data_length) ...
- CSS Sprite精灵图如何缩放大小
transform:scale( x ): 语法为:transform: scale(x,y). 同时有scaleX, scaleY专门的x, y方向的控制. 例如:transform: scale( ...
- 当在命令行中执行virtualenv venv时报此错误:'utf-8' codec can't decode byte 0xd5 in position 38: invalid continuation by
1.windows中安装虚拟环境virtualenv时, 当在命令行中执行virtualenv venv时报此错误:'utf-8' codec can't decode byte 0xd5 in po ...
- JavaWeb之过滤器
过滤器 什么是过滤器 1示意图: 过滤器的作用: 1.过滤器的作用好比一个保安.是servlet规范中的技术 2.用户在访问应用的资源之前或者之后,可以对请求做出一定的处理 编写过滤器步骤: 1.编写 ...
- springdata框架
SpringData jpa: JPA(Java Persistence API)是当年的 Sun 官方提出的 Java 持久化规范. Spring Data JPA 是 Spring 基 ...
- 1013 Battle Over Cities (25分) DFS | 并查集
1013 Battle Over Cities (25分) It is vitally important to have all the cities connected by highways ...
- k种球若干,取n个球,输出所有取球方案 (模拟)
有K种颜色的小球(K<=10),每种小球有若干个,总数小于100个. 现在有一个小盒子,能放N个小球(N<=8),现在要从这些小球里挑出N个小球,放满盒子. 想知道有哪些挑选方式.注:每种 ...
- Python数据类型-2 数字类型
数字类型 数字类型是不可变类型.所谓的不可变类型,指的是类型的值一旦有不同了,那么它就是一个全新的对象.数字1和2分别代表两个不同的对象,对变量重新赋值一个数字类型,会新建一个数字对象. 还是要强调一 ...
- Nacos client 客户端cpu占用100% 问题排查和解决方案
Nacos version:1.1.3client version:1.0.0 dependency: 'org.springframework.cloud:spring-cloud-alibaba- ...