Swoole中的协程和子进程

本文介绍了如何使用Swoole实现协程数据库连接池,详细展示了Swoole中的协程、进程概念,包括Master、Reactor线程、Worker进程等。此外,还探讨了Swoole创建子进程的场景,以及在抓取网页内容时使用子进程提升效率的例子。

目录

使用 Swoole 实现协程数据库连接池的代码

Swoole中的五种进程

Swoole创建子进程

swoole子进程的使用场景


在之前的 PHP Swoole的基本用法_浮尘笔记的博客-CSDN博客 中演示了Swoole对于TCP、UDP、HTTP、WebSocket的基本用法,本篇内容将主要演示Swoole中协程的使用。

进程、线程、协程

进程:是一个"执行中的程序”,进程的三态模型: 运行、就绪、堵塞。
线程:是进程中的一个实体,是被操作系统独立调度和分派的基本单位。线程是由操作系统控制的。
协程:是一种用户态的轻量级线程,协程的调度由用户控制。一个线程可以拥有多个协程,一个进程也可以单独拥有多个协程。

关于协程

  • 协程在阻塞的时候只是阻塞了当前这个协程并不会阻塞整个的进程因为协程是在线程内部的,即使阻塞了也会让出控制权,挂起,等待当前协程的IO不阻塞在回来继续执行,也就是同步的代码完成了异步的功能。
  • 协程是在单进程单线程当中实现的,可以在里面实现成千上万的协程,并且效果极高。每个协程去干不同的事!协作之间无需加锁没有抢占,串行的。
  • 协程之间每秒可以进行百万千万次切换!线程之间切换需要加锁,加锁就很浪费资源,进程间切换就更浪费资源了。
  • swoole提供了常驻内存、协程异步,这让PHP高性能微服务架构成为现实。
  • 从 4.0 版本开始 Swoole 提供了完整的协程(Coroutine)+ 通道(Channel)特性,带来全新的 CSP 编程模型。
  • Channel 可以理解为消息队列,只不过是协程间的消息队列,多个协程通过 push 和 pop 操作队列中的生产消息和消费消息,用来发送或者接收数据进行协程之间的通讯。需要注意的是 Channel 是没法跨进程的,只能一个 Swoole 进程里的协程间通讯,最典型的应用是连接池和并发调用。
  • 参考:Swoole 文档

使用 Swoole 实现协程数据库连接池的代码

<?php

namespace app\service;

use Swoole\Coroutine\MySQL;
use Swoole\Coroutine\Channel;
use function Swoole\Coroutine\run;

/**
 * Swoole 实现Mysql数据库协程连接池
 * @package app\service
 */
class MysqlPool {
    protected $size = 8;
    protected $pool;
    private $config;
    private static $instance;
    private function __construct($config) {
        if (!$this->pool) {
            run(function () use ($config) {
                if (isset($config['size']) && $config['size']) {
                    $this->size = $config['size'];
                }
                $this->pool = new Channel($this->size);
                //循环创建连接对象
                for ($i = 0; $i < $this->size; $i++) {
                    //在协程中创建数据库
                    go(function () use ($config) {
                        $swoole_mysql = new MySQL();
                        $swoole_mysql->connect([
                            'host' => $config['host'],
                            'port' => $config['port'],
                            'user' => $config['user'],
                            'password' =>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农兴哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值