目录
在之前的 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' =>

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

1084

被折叠的 条评论
为什么被折叠?



