国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

parallel可以替代pcntl_fork,功能更強(qiáng) , 補(bǔ)全php被閹割的多線程,非常適合密集運(yùn)算、大數(shù)據(jù)等

dignfei
擴(kuò)展 繼承父進(jìn)程線程的代碼和變量 全局變量獨(dú)立 讀寫其他進(jìn)程線程內(nèi)存 相互傳輸數(shù)據(jù)
pcntl_fork多進(jìn)程 繼承 不能 需要轉(zhuǎn)換成字符串發(fā)送
parallel多線程 不繼承 直接訪問

parallel核心優(yōu)勢:線程間可以直接相互訪問對方變量,不需要來回傳送數(shù)據(jù)

比如有大量數(shù)據(jù),需要開多個進(jìn)程計算處理:
使用pcntl_fork,需要將數(shù)據(jù)打包,然后發(fā)送給其他進(jìn)程,然后接收、計算完再把結(jié)果發(fā)送回來,數(shù)據(jù)的來回傳送占用大量的時間。
使用parallel,不要打包數(shù)據(jù)和發(fā)送,其他線程可以直接讀取數(shù)據(jù),計算, 然后把結(jié)果直接寫入主線程的變量中。

1.parallel默認(rèn)線程間相互獨(dú)立,不用擔(dān)心相互影響。
2.我們可以指定某個變量能相互共享,通過這個變量就可以實(shí)現(xiàn)線程之間相互讀寫對方的變量。
案例:

use parallel\{Channel,Runtime};
$Index = new stdClass();
$Index->b = 5;
my_save_P($Index); // 將$Index的內(nèi)存地址保存到 擴(kuò)展中 
$arr = [8,5,45,33];
$Index->arr = &$arr; // 通過這個操作可以在子線程中訪問 $arr 
$ff->arr[] = 31;

$runtime = new \parallel\Runtime();  // 創(chuàng)建子線程  
$future2 = $runtime->run(function(){ // 在子線程中運(yùn)行此方法
    $Index2 = my_read_P();  // 從擴(kuò)展中讀取主線程$Index的內(nèi)存地址,然后可以直接訪問。
    $Index2->arr[3] = 77;
    var_dump(( $Index2)); // 可以看到 這個變量兩邊都可以共同訪問 
});

其中 my_save_P()、my_read_P()是我自己寫的擴(kuò)展中定義的方法,功能非常簡單,就是保存變量的指針,其他線程可以讀取這個指針使用

5310 3 1
3個回答

dignfei

子線程是一個全新的線程,沒有加載任何代碼和變量,如果想使用 Composer包之類的,需要加載


$file  = __DIR__. '/../../../../artisan2.php'; // 新線程是空的, 通過這個php文件加載代碼
$runtime = new \parallel\Runtime($file);
$future2 = $runtime->run(function(){ // 在子線程中運(yùn)行此方法

});

artisan2.php文件內(nèi)容:

// 加載Composer包 
require __DIR__.'/vendor/autoload.php';
// 加載laravel框架  
$app = require_once __DIR__.'/bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
$status = $kernel->bootstrap();
  • 暫無評論
JustForFun

首先將你的表格弄正確吧。
另外,多進(jìn)程和多線程不是誰替代誰的關(guān)系。如果技術(shù)不過關(guān)的話,多線程相對容易出問題,例如你上面的代碼就會出現(xiàn)競態(tài)。
其實(shí) workerman 跟 nginx 有很大的相似之處,nginx 也是用多進(jìn)程的,不是么?php-fpm 也是多進(jìn)程的,貌似 php-fpm 也會出現(xiàn)內(nèi)存泄漏的問題(這個不太確定),多虧了多進(jìn)程,重啟進(jìn)程就完事。

  • dignfei 2020-11-23

    表格哪里錯了?php的多線程和多進(jìn)程一樣,全部是相互隔離的,不會出問題

  • JustForFun 2020-11-24

    @6279:你真覺得沒有錯?你一個進(jìn)程中的線程,指的是哪個父進(jìn)程?你不會是指 init 進(jìn)程吧?全局變量獨(dú)立是什么?讀寫其它進(jìn)程的內(nèi)存?怎么讀?你當(dāng)保護(hù)位是假的?相互傳數(shù)據(jù)?誰跟誰傳?進(jìn)程內(nèi)的多個線程共享同一內(nèi)存空間,線程之間是沒有隔離的;進(jìn)程之間是完全隔離的

  • dignfei 2020-11-25

    @7304:多進(jìn)程的就全部指進(jìn)程,多線程的就全部指線程 。

xiuwang

說下我的觀點(diǎn)。
pcntl_fork只是pcntl進(jìn)程控制系列的一個接口,除了pcntl_fork,它還有重要的pcntl_wait(檢測進(jìn)程退出事件),pcntl_kill(關(guān)閉進(jìn)程接口)。pcntl_wait 和 pcntl_kill 這2個接口 parallel 好像沒有暴露接口,所以線程控制這里貌似不完整?

不過這個擴(kuò)展還是很有用,目測可以加快業(yè)務(wù)處理速度,比如一個頁面要顯示3個模塊,正常業(yè)務(wù)串行處理。用了parallel可以并行處理,這樣就能大大減少響應(yīng)時間。

  • dignfei 2020-11-23

    并發(fā)非常好用。 有kill 和 close方法 可以關(guān)閉線程。線程默認(rèn)是不會退出的,會一直運(yùn)行。如果掛了怎么辦?可以用try{} catch{}捕捉到,然后可以在catch里面的代碼中可以把錯誤發(fā)給主線程,相當(dāng)于實(shí)現(xiàn)了pcntl_wait 功能

年代過于久遠(yuǎn),無法發(fā)表回答
??