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