国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 邏輯算法 > 正文

PHP 進程池與輪詢調度算法實現多任務

2020-03-22 16:22:30
字體:
來源:轉載
供稿:網友
phper 請了解進程調度策略,CPU 時間片,進程控制【創建,銷毀,回收,進程信號】與及進程運行流程和基本的進程組,信號中斷原理,以及進程之間的關系。

進程的通信:

匿名管道,命名管道,消息隊列,內存共享,socketpair 請自行擼代碼測試哦

進程的調度算法:

輪詢,隨機分發,計分板等策略或是搞個優先極或是隊列,或是堆棧等基本的算法【自己去發揮哦】

進程池:

擼過 tcp 的話應該知道要能處理多個客戶端,就得用 IO 復用技術【事件多路分發器】或是多進程以及多線程,每來一個客戶端就 fork 一個進程或是線程,那樣的話上下文切換成本特別高,所以咱們先創建好一組進程【進程池】,等客戶端連接上來的時候,通過某種算法【我們用的輪詢】來選擇某個進程投遞任務來干活,這樣的話就不用創建又銷毀來回折騰了,提升它的效率。

下面是 PHP 代碼版本的實現

<?php/** * Created by PhpStorm. * User: 1655664358@qq.com * Date: 2019/1/12 * Time: 16:18 */$flag = 1;html' target='_blank'>class process{    public $pid;    public $name;    public $file;    public $num;}class instance{    public $processIdx;    public $proc = [];    public $processNum;}function sigHandler($sigNo){    global $flag;    $flag = 0;    echo "信號中斷處理".PHP_EOL;}function processPool(instance &$instance,$num){    if (!$instance||$num==0){        fprintf(STDERR,"%s","參數錯誤");        return 1;    }    $instance->processIdx = 0;    $instance->processNum = $num;    pcntl_signal(SIGINT,'sigHandler');    pcntl_signal(SIGTERM,'sigHandler');    $process = new process();    for ($i=1;$i<=$num;$i++){        $instance->proc[$i] = clone $process;        $instance->proc[$i]->file = $i;        $instance->proc[$i]->pid = pcntl_fork();        $instance->processIdx = $i;        if ($instance->proc[$i]->pid<0){            exit("進程創建失敗");        }        else if ($instance->proc[$i]->pid>0){            //nothing            continue;        }else{            worker($instance);        }    }    master($instance);    $exitProcess= [];    while (1){        for ($i=1;$i<=$num;$i++){        //非阻塞方式回收子進程            pcntl_waitpid($instance->proc[$i]->pid,$status,WNOHANG);            if ($status){                $exitProcess[] = $instance->proc[$i]->pid;                fwrite(STDOUT,"worker#".$instance->proc[$i]->pid."-".$status,30);            }        }        if (count($exitProcess)==$instance->processNum){            exit(0);        }        usleep(1000);    }}//簡單的輪詢算法  自己可以用隊列,隨機,鏈表,棧鏈,二叉樹啥的折騰function roundRobin(&$instance,$roll){    /** @var instance $instance */    return $instance->proc[$roll%$instance->processNum+1];}function master(&$instance){    /** @var instance $instance */    fprintf(STDOUT,"master 進程 %d/n",$instance->processIdx);    global $flag;    $roll = 0;    while ($flag){        pcntl_signal_dispatch();        /** @var process $process */        $process = roundRobin($instance,$roll++);        echo "輪詢的進程:".$process->pid.PHP_EOL;        $file = $process->file;        posix_mkfifo($file,0666);        $fd = fopen($file,"w");        fwrite($fd,"hi",2);        sleep(1);    }    for ($i=1;$i<=$instance->processNum;$i++){        posix_kill($instance->proc[$i]->pid,9);    }    fprintf(STDOUT,"master shutdown %d/n",$instance->processIdx);}function getProcess(&$instance){    /** @var instance $instance */    return $instance->proc[$instance->processIdx];}function worker(&$instance){    /** @var process $process */    $process = getProcess($instance);    while (1){        $file = $process->file;        posix_mkfifo($file,0666);        $fd = fopen($file,"r");        $content = fread($fd,10);        fprintf(STDOUT,"worker#%d讀取的內容:%s file=%d/n",posix_getpid(),$content,$file);    }    exit(0);}$instance = new instance();processPool($instance,5);

效果

173f25b35990b42c06bd7ab441ffa4f.png

以上就是PHP 進程池與輪詢調度算法實現多任務的詳細內容,更多請關注 其它相關文章!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 会昌县| 鄂托克旗| 苍溪县| 吴江市| 乐陵市| 平陆县| 麟游县| 灵武市| 邹平县| 华池县| 凤台县| 栖霞市| 武功县| 九龙县| 紫云| 巴彦县| 颍上县| 长葛市| 喜德县| 日照市| 新蔡县| 台东县| 黔西县| 双桥区| 东山县| 许昌市| 奉节县| 屏山县| 伊春市| 石嘴山市| 陈巴尔虎旗| 平塘县| 耒阳市| 新源县| 古浪县| 永州市| 精河县| 五家渠市| 九江市| 德昌县| 萨嘎县|