麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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

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

進程的通信:

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

進程的調度算法:

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

進程池:

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

下面是 PHP 代碼版本的實現

<?php/** * Created by PhpStorm. * User: [email protected] * 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 進程池與輪詢調度算法實現多任務的詳細內容,更多請關注 其它相關文章!

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品久久久久av | 日韩精品久久久久久久九岛 | 日本a级一区 | 成人黄视频在线观看 | 精品久久久av | 日韩精品中文字幕在线播放 | 伊久在线 | av在线等| 成人偷拍片视频在线观看 | 香蕉久久久久久 | 亚洲第一综合 | gogo全球大胆高清人露出91 | 成人免费观看在线视频 | 天天看天天摸天天操 | 国产亚洲综合一区二区 | 看a级毛片 | 免费午夜视频在线观看 | 日本一区二区视频在线观看 | 久久九九热re6这里有精品 | 91成| 91精品国产综合久久青草 | 成人短视频在线观看免费 | 视频一区二区三区免费观看 | av在线播放电影 | 素人视频免费观看 | 欧美一级片在线 | 成人午夜免费网站 | 五月婷婷第四色 | 久久久久av电影 | 久久精品亚洲精品国产欧美kt∨ | 欧美18一12sex性处hd | 久久国产一级 | 久啪视频 | 久久精品色 | 久草视频免费 | 精品一区二区久久久久久按摩 | 成人午夜精品久久久久久久蜜臀 | 亚洲精品 在线播放 | 毛片在线视频观看 | 欧美黑大粗硬毛片视频 | 亚洲99|