通道,类似于go语言的chan,支持多生产者协程和多消费者协程。底层自动实现了协程的切换和调度。
实现原理
通道与PHP的Array类似,仅占用内存,没有其他额外的资源申请,所有操作均为内存操作,无IO消耗
底层使用PHP引用计数实现,无内存拷贝。即使是传递巨大字符串或数组也不会产生额外性能消耗
Channel->push :当队列中有其他协程正在等待pop数据时,自动按顺序唤醒一个消费者协程,当前生产者协程自动挂起,切换到消费者pop协程执行,执行完毕后切换回push生产者携程继续执行。当队列已满(push次数(且未pop消费)达到通道的容量,Chnnel->$capacity)时自动yield让出控制器,此时无法再继续向通道写数据(除非有数据消费),等待其他协程消费数据
Channel->pop:当队列为空时自动yield挂起,等待其他协程生产数据。消费数据后,队列可写入新的数据,自动按顺序唤醒一个生产者协程。
Coroutine\Channel使用本地内存,不同的进程之间内存是隔离的。只能在同一进程的不同协程内进行push和pop操作
网友评论