隨機生成問題
由于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ù)同樣會受到影響
場景例子
在異步任務,異步進程中,都需要注意隨機數(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();
}