隨機生成問題
由于Swoole本身的原因,在使用隨機數時,需要額外注意,如果在父進程內調用了mt_rand
,不同的子進程內再調用mt_rand
返回的結果會是相同的。所以必須在每個子進程內調用mt_srand
重新播種。
shuffle
和array_rand
等依賴隨機數的PHP
函數同樣會受到影響
場景例子
在異步任務,異步進程中,都需要注意隨機數播種的問題,如下面的例子
mt_rand(0, 1); // 此處調用了 mt_rand 已經在父進程內自動播種
$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(); // 此處 必須要重新播種 否則會得到相同的結果
echo mt_rand(0, 100) . PHP_EOL;
$worker->exit();
}