PHP的協程跟GO的協程實現有什麼區別?

時間 2021-05-31 08:32:53

1樓:Shulamith

黑色高階車和白色低階車的區別(((

swoole那個基本上就是最常見的有棧協程的實現,各種語言社群裡一抓一大把,主要作用是給只會/只能用PHP的程式設計師打雞血. go的實現則比較高階,主要優勢在於:

跑在多個系統執行緒上,可以充分利用多核

讓出執行權的節點不只是io,還有函式呼叫

2樓:xtlsoft

底下的同學們請認真審題,問的是 Swoole 的協程和 Go 的協程有什麼區別。

Swoole 的協程已經是不需要使用 yield 關鍵字了,與 Golang 的 go func() 的寫法一致。

具體實現上 Swoole 協程是仿製的 Erlang OTP 和 Go 的 Goroutine 的,所以在大概念上差別不是很大,幾乎完全一致。

但是內部實現上也有一些區別。htf在發布Swoole4.0之前有專門發文寫過,他也在Easyswoole和MSF等群中分享過。

Swoole4 協程與 Go 協程有哪些區別

這是位址。

其中有幾大差別,我按照我自己的理解提一下:

Swoole 的協程使用單程序單執行緒模型,Go 協程使用多程序多執行緒模型。這也就是在某些場景下 Swoole 反而比 Go 快的原因。當然,封裝多執行緒也不是什麼難事,pthread/pcntl一把梭,怕煩就用個ReactProcessManager。

Swoole 的協程目前僅僅支援對於 Swoole 內部封裝 IO 操作的自動排程,而 Go 由於協程嵌入到了語言層面,所以支援對所有 IO 操作的自動排程。Swoole 有向 Go 學習的打算,但是由於時間原因,還沒有實現。(這在上面那個文章裡好像沒有體現,但是我記得htf是說過這話的)

由於 PHP 的 Object 具有析構函式,所以一些 GC 的操作不需要顯式使用 defer 去做,有些 PHP 會自動幫你做,所以 PHP 中不需要過多使用 defer。

關於同時讀寫 Socket,PHP 禁止了這種操作。我個人認為 Go 允許是因為 Go 的 io.Reader 和 io.

Writer 有可能是指向某個時序無關的流,於是就允許了。而 PHP 中直接寫死禁止,當然你可以用全域性鎖(這文件沒提,我可能會用鎖,就和在 Go 中併發讀寫 map 一樣,雖然現在有了 sync.Map)、Channel或內建的連線池封裝。

以及回應一下下面的朋友們,你們說的yield協程Swoole官方也有發文說過區別:

Swoole4 協程與 PHP 的 Yield/Generator 協程有什麼區別

而且其實 yield 協程配合 ReactPHP/amphp 等庫用著和 nodejs 的 async/await 一樣都非常爽(

關於 @塵墜 的回答呢,說的是第一點沒錯,但是不是多核就能真並行,單核就不能。單看IO操作,二者都是能夠並行完成的。然而對於平行計算任務,Swoole的協程並不支援自動spawn新程序或開新執行緒,所以只會執行在乙個核上。

所以一般用Swoole跑計算任務還會同時使用pthreads/pcntl。

----二更

Swoole原生多執行緒指日可待。

3樓:濤叔

php 的協程是 generator,是 stackless 協程,需要自己實現排程邏輯。php 的協程是比 js 的 async/await 還要不方便的特性。

go 的協程是 stackfull 協程。執行時自動排程,完全是用同步的方式來實現非同步效果。

漏掉了 @塵墜 提到的並行特性。

在實際生產中,我經常會同時發起多個介面呼叫,不同的呼叫互不關聯。這類場景使用 php 的協程是沒有辦法並行執行的。

PHP 的協程化是什麼意思?

沒啥複雜的東西。磁碟IO,網路IO一般都是同步阻塞的。像你上述提到的三個類庫,都是網路IO,一般情況下都是同步阻塞的方式。1.並不是 協程化 之後才能用 不修改,同步阻塞操作會阻塞整個程序,能處理的併發請求就少了,就失去了使用協程的初衷了。2.第三方類庫一般都設計的很好,只要自定義乙個handler...

多個go協程從乙個channel獲取資料,需要額外的排程嗎?

Aka Kamicoding go內部最常見的設計模式 使用通訊的方式進行資訊的共享,而不是用共享記憶體的方式 Goroutine之間的通訊方式 Channel 有兩種方式進行執行緒之間的通訊 共享記憶體 全域性變數 需要通過鎖機制來解決競態問題 限制同一時間使用該共享記憶體的執行緒數量 訊息機制 ...

python中的協程(yield)內部是怎麼實現的?python和lua在yield的實現原理上有什麼區別?

可能某個yield下呼叫棧是這樣 main resume Perm Perm list,3 Perm list,2 Perm list,1 yield list 對於Lua來說,程式會從yield直接跳到resume,等下次resume再回到Perm list,1 裡面yield。對於Python來...