Golang协程 与 PHP协程的概念

协程的目的是充分利用cpu处理程序,当有io操作时会挂起,io等待时间完全忽略,已达到程序并发;

php协程概念:

目前已知php可以实现协程的方法是使用swoole扩展;

模拟业务场景,比如我们要抓取豆瓣电影top250;

go(){

$http = new http(); (请求class)

while(ture){
    
    $result = $http->get('豆瓣top250.com')
    //处理结果

}
}

当程序运行至发送请求时,这个时候会产生io操作,当前协程保存zend VM上下文 并挂起协程让出当前cpu执行时间,让下一个协程进行处理;

当Io事件结束后,底层会调用c函数恢复对应协程,并恢复zend vm上下文,继续执行下面的代码;

 

go简介:go原生就支持协程,主要卖点中也有协程 + 管道,当然最大的卖点是,高效开发、飞速编译、运行速度直逼c++;

golang协程概念:

package main

import (
    "net/http"
)

func main(){
    
    for i := 0; i <= 10; i++{
        go spider() 
    }
}

func spider() {
    http.Newrequest('get', '豆瓣top250.com', nil)
}

tip:在php中开启协程的方式是使用go函数,而go中可以使用函数形式,也可以使用关键字形式;

tip:由于go本身没有对使用多少个协程数量而限制,所以我们可以利用for开启指定协程(当然这样做不合理,合理的方式是使用协程池)

当程序运行至http.newrequest时,会把当前协程中的代码压入一个等待执行的队列中,go本身会开启n个线程,去消费这个队列并执行该协程中的代码;

 

个人理解,php协程与golang协程最大的区别在于,如果使用php协程想利用多核cpu,只能通过多进程 + 协程实现,而golang协程只需要声明一下。

原因是php协程实际上是基于一个线程在运行,golang协程是基于n个协程在运行(声明cpu越多,会创建的线程也越多);

也就是说php协程单进程+多协程实际上实现的是并发,而go实现的是并行;

 

 

 

 

 

你可能感兴趣的:(php,golang)