自从php武装上swoole以后,战斗力大大提升,特别是有了协程后,很多逻辑都可以异步执行了。随着PHP编程语言被越来越多的人使用,更多人了解到swoole的存在,有的人说swoole是披着PHP外衣的C程序,但是swoole并不是一个简单的PHP框架,
正如swoole官方首页的第一句话“重新定义PHP”,千万不要用旧有php的思想来写swoole代码!
进程、线程、协程的概念
- 进程是什么?
进程就是应用程序的启动实例。
例如:打开一个软件,就是开启了一个进程。
进程拥有代码和打开的文件资源,数据资源,独立的内存空间。
- 线程是什么?
线程属于进程,是程序的执行者。
一个进程至少包含一个主线程,也可以有更多的子线程。
线程有两种调度策略,一是:分时调度,二是:抢占式调度。
- 协程是什么?
协程是轻量级线程, 协程的创建、切换、挂起、销毁全部为内存操作,消耗是非常低的。
协程是属于线程,协程是在线程里执行的。
协程的调度是用户手动切换的,所以又叫用户空间线程。
协程的调度策略是:协作式调度。
golang和swoole区别
- 开发效率
Go语言是本质上是静态语言,开发效率一般,但性能更强,更适合底层软件的开发
Swoole使用PHP语言,动态脚本语言,开发效率最佳,更适合应用软件的开发
- 语言性能
go语言是静态编译的,语言本身的性能大大超过php,密集计算更有优势
php是动态解释执行的,语言性能较差,不适合密集计算程序
将密集计算、大量调用的代码使用C扩展实现可以解决部分PHP性能问题
Go协程(goroutine)是运行在多线程上的,线程可以共享堆栈和文件描述符,功能更强大,在实现连接池、并发库方面更有优势。额外的带来的一个问题是,存在数据同步问题,需要用户自行考虑加锁。
Swoole的用户代码运行在多进程环境,无需考虑加锁问题。但无法直接访问内存和资源。需要借助Task进程实现中转。
总结
Swoole
Swoole 的协程客户端必须在协程的上下文环境中使用。
Swoole 的协程是基于单线程的, 无法利用多核CPU,同一时间只有一个在调度。
Go
goroutine 是轻量级的线程,Go 语言从语言层面就支持原生协程。
goroutine 是通过 GPM 调度模型实现的,简单说就是产生的所有协程其它的线程是有空就能去执行的,是多cpu调度的,相当于有一个协程池,空闲的cpu会去池子里执行协程任务,相比swoole的单cpu调用更有效地利用系统资源。可以方便的实现API的并行处理,达到处理效率的最大化。
Docker方法安装
docker pull golang
docker run -itd -p 8090:8080 -v D:\work\workspace\project\golang:/go --name golang-dingml golang
docker exec -it golang-dingml bash
Go环境变量设置
go env -w GO111MODULE=on#go包下载代理地址,为了下载包快速
go env -w GOPROXY="https://goproxy.cn"#go包下载代理地址,为了下载包快速
go env -w GOPATH="/go" #如果本身就是,那就不需要再改了,可以省略
下载并安装gin
go get -u github.com/gin-gonic/gin
编写main入口
/*
* @Author: Dingml
* @Date: 2023-02-24 16:43:24
* @Descripttion:
*/
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"status":http.StatusOK,
"message": "pong",
})
})
r.GET("/", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"status":http.StatusOK,
"message": "hello world",
})
})
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}