談一談生產環境中swoole協程建立數量控制機制

2021-10-24 20:13:45 字數 1334 閱讀 7138

在swoole官方文件中,有提及「協程開銷」。簡單引用如下:

為了驗證php7.2中,建立乙個協程是否預設為8k,可以寫個demo簡單測試一下

<?php

$begin_memory = memory_get_usage();

go(function () );

var_dump(memory_get_usage() - $begin_memory); //輸出int(8640),單位是byte, 就是8k左右。

既然建立乙個協程,預設分配8k記憶體,假設我們在協程中執行的**使用的棧記憶體,不超過8k,那麼1g的記憶體大約可以建立多少個協程呢?1g= 1024mb = (1024 * 1024)kb, max_coroutine_num = 1024 * 1024 / 8 = 130072。也就是說1g記憶體就可以建立10w+的協程數量。相當的可觀。但是實際情況,棧記憶體可能會超過。

筆者當前有個業務場景,從redis佇列中pop資料,然後開協程寫入mysql,我們知道mysql的寫速度落後redis非常多,當業務高峰期,redis佇列資料量猛增時,mysql達到瓶頸之後,協程的數量就會積壓。高峰期持續時間達到一定程度,那麼最終會因為記憶體資源不足,導致新的協程無法再建立,這時swoole會觸發:php warning: php warning:  go(): exceed max number of coroutine ... 

所以得出乙個經驗:在生產消費模型中,最好對swoole 協程建立數量進行控制

swoole協程控制方案:

1、依賴swoole底層的max_coroutine配置。給出示例demo

<?php

set_error_handler(function () );

co::set(['max_coroutine' => 1]);

try );

}} catch (\throwable $e)

}

2、自己建立乙個context管理統計當前正在執行的協程數量,超過指定的數量,丟擲異常或者自定義處理

<?php

$co_ctx = ;

go(function () use ($co_ctx)

$cid = co::getcid();

defer(function () use ($cid, $co_ctx)

});$co_ctx[$cid] = $cid;

//begin business ...

});

討論結束,不正之處 ,多多指教!                     thks!!!

談一談UVM中的p sequencer

我們先來看乙個簡單的例子 bird是乙個基類 class bird bit 3 0 src 0 bit 3 0 drc 1 virtual task exec task display in bird endtask endclass parr是乙個bird的擴充套件類 class parr ext...

談一談css中的100 和auto

在web前端的程式設計過程中,利用 數值和auto來進行設定元素的寬度和高度等是很常見的,但是他們的值是怎樣計算的呢?一 100 百分比設定畫素是很常見的,也比較簡單。一般在兩個地方用的比較多 設定子元素寬高和設定 內 外 邊距。1.首先看設定寬高,先看例子 html class content d...

談一談js中的深拷貝與淺拷貝

let a let b a a.age 2 console.log b.age 2從上述例子中我們可以發現,如果給乙個變數賦值乙個物件,那麼兩者的值會是同乙個引用,其中一方改變,另一方也會相應改變。通常在開發中我們不希望出現這樣的問題,我們可以使用淺拷貝來解決這個問題。首先可以通過 object.a...