摘要:實現異步的方式有哪些提供了一些異步方法那它們底層是用哪種方式實現的呢實現異步的方式有線程方式進程方式復用線程方式和進程方式類似有異步請求時開一個線程或者進程獲取到數據后線程間可以直接共享數據進程間可以通過進程通信機制,如共享內存管道等方式進
實現異步的方式有哪些? swoole提供了一些異步方法, 那它們底層是用哪種方式實現的呢?
實現異步的方式有:
線程方式
進程方式
IO復用
線程方式和進程方式類似, 有異步請求時, 開一個線程或者進程, 獲取到數據后, 線程間可以直接共享數據. 進程間可以通過進程通信機制,如共享內存,管道等方式進行數據傳送. 思路很簡單, 可以參考這篇利用swoole_process和eventloop實現php異步編程, 但是缺點非常明顯, 開銷太大, 一個異步請求,就要開一個線程或者進程.
IO復用方式, 通常有select,poll, epoll這幾種方式, 當下最流行的當然是epoll, 性能好, 理論上來說沒有連接限制, 單個進程內可以維持數十萬的連接. 使用這種方式,當有異步請求時,可以在當前進程內,再開一個連接做異步請求,開銷很少, 性能很好, 主流的異步實現都是這種方式.
swoole提供了一些異步http client, mysql client, 可以讓你異步地訪問http server和mysql server, 通過回調的方式對返回的數據進行處理, 它們使用的方式就是IO復用.
來看一段swoole的源代碼:
異步tcp請求
static int swClient_tcp_connect_async(swClient *cli, char *host, int port, double timeout, int nonblock) { int ret; cli->timeout = timeout; //alloc input memory buffer cli->buffer = swString_new(cli->buffer_input_size); if (!cli->buffer) { return SW_ERR; } if (!(cli->onConnect && cli->onError && cli->onClose)) { swWarn("onConnect/onError/onClose callback have not set."); return SW_ERR; } if (swClient_inet_addr(cli, host, port) < 0) { return SW_ERR; } while (1) { ret = connect(cli->socket->fd, (struct sockaddr *) &cli->server_addr.addr, cli->server_addr.len); if (ret < 0) { if (errno == EINTR) { continue; } SwooleG.error = errno; } break; } if ((ret < 0 && errno == EINPROGRESS) || ret == 0) { if (SwooleG.main_reactor->add(SwooleG.main_reactor, cli->socket->fd, cli->reactor_fdtype | SW_EVENT_WRITE) < 0) { return SW_ERR; } return SW_OK; } return ret; }
關鍵看這一段:
if (SwooleG.main_reactor->add(SwooleG.main_reactor, cli->socket->fd, cli->reactor_fdtype | SW_EVENT_WRITE) < 0) { return SW_ERR; } return SW_OK;
就是把socket fd放到reactor中監聽, 本質上就是epoll, 也就是IO復用技術.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/22792.html
摘要:原文地址要想更好了解編程,有一個不可繞過的環節就是在中,一切皆文件實際上要文件干啥不就是讀寫么所以,這句話本質就是才是王道用的打開文件關閉文件讀讀寫寫,這叫本地文件在編程中,本質就是網絡所以,在開始進一步的編程前,我們必須先從概念上認識好 [原文地址:https://blog.ti-node.com/blog...] 要想更好了解socket編程,有一個不可繞過的環節就是IO.在Lin...
摘要:現在在后端業務開發編程方面,技術力量強的團隊已經開始將技術棧從同步模式切換為異步了。使用這些技術方案是無法兼容已有程序的。影響了異步回調技術棧的普及。將會成為未來后端開發領域的主流技術方案。 今天太忙,少寫一點,后面再補充。 異步模式 Go 語言越來越熱門,很多大型互聯網公司后端正在轉向 GO 。Java 圈知名的服務化框架 Dubbo 也宣布轉型異步模式。這是一個大趨勢,異步模式已經...
摘要:需要先對的概念有一定的認識我們通常使用的打開文件關閉文件讀讀寫寫這叫本地文件而在編程中本質其實是網絡同步異步阻塞非阻塞之前反正一直搞不清楚同步和阻塞異步和非阻塞的概念總感覺同步就是阻塞異步就是非阻塞的總是搞得暈乎乎的于是就重新查了些資料進行 IO 需要先對 IO 的概念有一定的認識: 我們通常使用php的fopen打開文件關閉文件讀讀寫寫, 這叫本地文件IO; 而在socket編程中...
摘要:函數式編程與面向對象編程編程的本質之劍目錄編程的本質讀到兩篇文章寫的不錯綜合摘錄一下復合是編程的本質函數式程序員在洞察問題方面會遵循一個奇特的路線。在面向對象編程中,類或接口的聲明就是表面。 函數式編程與面向對象編程[5]:編程的本質 之劍 2016.5.6 01:26:31 編程的本質 讀到兩篇文章,寫的不錯, 綜合摘錄一下 復合是編程的本質 函數式程序員在洞察問題方面會遵循...
摘要:下文如無特殊聲明將使用進程同時表示進程線程。收到數據后服務器程序進行處理然后使用向客戶端發送響應。現在各種高并發異步的服務器程序都是基于實現的,比如。 并發 IO 問題一直是服務器端編程中的技術難題,從最早的同步阻塞直接 Fork 進程,到 Worker 進程池/線程池,到現在的異步IO、協程。PHP 程序員因為有強大的 LAMP 框架,對這類底層方面的知識知之甚少,本文目的就是詳細介...
閱讀 3778·2021-09-02 09:53
閱讀 2755·2021-07-30 14:57
閱讀 3499·2019-08-30 13:09
閱讀 1202·2019-08-29 13:25
閱讀 815·2019-08-29 12:28
閱讀 1461·2019-08-29 12:26
閱讀 1136·2019-08-28 17:58
閱讀 3310·2019-08-26 13:28