隨機生成問題
由于Swoole本身的原因,在使用隨機數(shù)時,需要額外注意,如果在父進程內(nèi)調(diào)用了mt_rand,不同的子進程內(nèi)再調(diào)用mt_rand返回的結(jié)果會是相同的。所以必須在每個子進程內(nèi)調(diào)用mt_srand重新播種。
shuffle和array_rand等依賴隨機數(shù)的PHP函數(shù)同樣會受到影響
場景例子
在異步任務(wù),異步進程中,都需要注意隨機數(shù)播種的問題,如下面的例子
mt_rand(0, 1); // 此處調(diào)用了 mt_rand 已經(jīng)在父進程內(nèi)自動播種
$worker_num = 16;
// fork 進程
for ($i = 0; $i < $worker_num; $i++) {
$process = new swoole_process('child_async', false, 2);
$pid = $process->start();
}
function child_async(swoole_process $worker)
{
mt_srand(); // 此處 必須要重新播種 否則會得到相同的結(jié)果
echo mt_rand(0, 100) . PHP_EOL;
$worker->exit();
}