[Sw] Swoole-4.2.9 可以尝试愉快应用 Swoole 协程

通过llama.cpp与羊驼聊天的网页界面- 详解 Serge 的启动使用

 

大家知道 Swoole 提供了方便于服务器、网络编程的模式,简化了多进程编程。

这直接让 PHP 的运行很容易变成常驻内存的 Server 程序,执行效率上有了数倍的提升。

但是这一切还没有让人足够兴奋,直到协程的完整支持,也就是说,可以随时随地并发了。

swoole-4.2.9 及以上,完整支持了 Go + Chan + Defer 编程模式,给了我们在 PHP 上面不一样的体验。

(协程 Go+Chan+Defer:https://wiki.swoole.com/wiki/page/1019.html) 

go :创建一个协程
chan :创建一个通道
defer :延迟任务,在协程退出时执行,先进后出

 

就下面是一段简短的程序,来领略一下什么是随时随的并发:

默认允许创建的最大协程数是 3000,超过会有提示,随后循环 1w 次,

循环中使用 go 创建协程,这就创建了 1w 个协程,运行时占用 350M 左右,CPU 5%左右。

 

[ 自动开启协程,同步 IO 切换为异步 IO ]

通过 `php --ri swoole` 查看拓展的一些配置项,enable_coroutine 是默认开启的。

下面这些回调中会自动创建协程,不需要使用 Coroutine::create( ) 或者 go( ) 创建:

  • onWorkerStart
  • onConnect
  • onOpen
  • onReceive
  • redis_onReceive
  • onPacket
  • onRequest
  • onMessage
  • onPipeMessage
  • onClose
  • tick/after 定时器

(enable_coroutine:https://wiki.swoole.com/wiki/page/949.html

 

Swoole\Runtime::enableCoroutine( ) 作用是将 PHP 提供的 stream、sleep、pdo、mysqli、redis 等功能从同步阻塞切换为协程的异步 IO。

这样在 go( ) 中的一些函数不一定要使用协程客户端了, 比如可以用 sleep 替代 co::sleep( ) 、PDO 代替 Coroutine\MySQL。

(Runtime:https://wiki.swoole.com/wiki/page/965.html

 

如果想要顺利的使用协程编程,我们可能还需要 WaitGroup 功能,将极大方便 Swoole 协程编程。

 

- 扩充资料 -

协程编程须知:https://wiki.swoole.com/wiki/page/851.html

协程并发调用:https://wiki.swoole.com/wiki/page/p-coroutine_multi_call.html

MySQL连接池与断线重连:https://wiki.swoole.com/wiki/page/350.html

 

Happy coding.

Refer:Swoole的优劣

Link: https://www.cnblogs.com/farwish/p/10236757.html

posted on 2019-01-08 01:06  ercom  阅读(864)  评论(0编辑  收藏  举报