国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

自己實現異步執行任務的隊列(二)

zr_hebo / 1758人閱讀

摘要:六隊列具體實現三寫執行隊列的程序根據設計,執行隊列的程序文件是,它的主要功能是把任務從隊列表里取出來,并且在后臺執行。八服務器部署一配置咱們執行隊列的程序都寫好了,這個程序怎么觸發呢,當然就要用到的定時任務,每隔一定的時間,執行一次。

六、隊列具體實現三:寫執行隊列的程序
根據設計,執行隊列的程序文件是 do_queue.php , 它的主要功能是把任務從隊列表里取出來,并且在后臺執行。
do_queue.php部分代碼:

$phpcmd = exec("which php");    //查找到php安裝位置
$cqueue = new Queue();
$tasks = $cqueue->getQueueTask(200);
foreach ($tasks as $t)
{
    $taskphp = $t["taskphp"];
    $param = $t["param"];
    $job = $phpcmd . " " . escapeshellarg($taskphp) . " " . escapeshellarg($param);
    system($job);
}

七、具體任務的業務實現
還是拿群發消息來做例子,我們需要寫好一個群發消息的程序,這個程序接收事先定義好的參數,然后根據參數調用發消息的接口把消息發送出去。
這個一般由做業務功能的工程師實現。但是架構師事先得寫文檔例子,教會別人使用。
send_msg.php:

$para = $argv[1];
$arr = unserialize($para);
$cmessage = new Message();
foreach($arr["uids"] as $touid)
{
    $cmessage->send($arr["uid"], $touid, $arr["content"]);
}

八、服務器部署一:配置crontab
咱們執行隊列的程序都寫好了, 這個程序怎么觸發呢,當然就要用到linux的定時任務,每隔一定的時間,執行do_queue.php一次。但是呢,這里不是直接調用do_queue.php,咱們再提高一層,加個調度程序cron_mission.php, 在cron_mission.php里面調用do_queue.php
配置定時任務 crontab:
l crontab –e
l * * * * * cd /ucai/schedule;php cron_mission.php >> cron_mission.log

可以先使用crontab -l查看本機已經使用的定時任務

九、服務器部署二:寫定時任務調度程序
思路:將定時任務寫入到任務調度程序cron_mission.php中,這樣可以在cron_mission.php中靈活控制隊列任務。相比較直接通過crontab控制doQueue.php而言,避免了頻繁修改服務器上的crontab,從安全,便于維護等角度來說,都是上策。

cron_mission.php 示例:

if ($minute % 5 == 0)
{
    if(chdir($site_dir."app/")) {
        $cmd = "$phpcmd do_queue.php > do_queue.log &";
        echo "[" , $ymd , " " , $hour , ":" , $minute , "] " , $cmd , "n";
        system($cmd);
    }
}

十、開啟多進程并發執行隊列
思路:對任務序列進行編號,數據庫中執行的時候
where條件加上id%每個隊列要執行任務總數=隊列編號
這樣可以避免重復處理
例如:每個進程執行10條任務,修改如下
1:定時任務的修改
修改前:

if ($minute % 5 == 0)
{
    if(chdir($site_dir."app/")) {
        $cmd = "$phpcmd do_queue.php > do_queue.log &";
        echo "[" , $ymd , " " , $hour , ":" , $minute , "] " , $cmd , "n";
        system($cmd);
    }
}

修改后:

if ($minute % 5 == 0)
{
    for ($i=0; $i < 10; $i++) { 
        $cmd = "$phpcmd doQueue.php 10 $i>> doQueueMission".date("Y-m-d").".log  ";
        echo  date("Y-m-d H:i:s") . "t : " .$cmd."n";
        system($cmd);
    }
}

//每次進行10個進程,$i來區分是當前的進程標示
2:隊列執行程序的修改
修改前:

$phpcmd = "D:workwampbinphpphp5.3.10php ";
$cqueue = new Queue();
$tasks = $cqueue->getQueueTask(200);

修改后:

$phpcmd = "D:workwampbinphpphp5.3.10php ";
$total=$argv[1];
$i=$argb[2];
$cqueue = new Queue();
$tasks = $cqueue->getQueueTask($total,$i,200);

3:取隊列接口的修改

public function getQueueTask($limit = 1000)
     {
        $limit = (int)$limit;
        $sql = "select id, taskphp, param from queue  where status = 0 order by id asc";
        $re = query($sql);
        return $re;
     }

修改后:

public function getQueueTask($total,$i,$limit = 1000)
     {
        $limit = (int)$limit;
        $sql = "select id, taskphp, param from queue  where status = 0 and id%$total=$i order by id asc";
        $re = query($sql);
        return $re;
     }

4:需要關注服務器壓力
進程數定為多少,取決于服務器壓力

十一、實現任務優先級
1:任務存儲表加優先級字段
在數據表里,加一個優先級字段,按字段值的數值大小來區分優先級
2:修改取隊列任務接口,按優先級取
同樣是在sql語句中增加order by

十二、記錄隊列日志
1:關鍵地方加echo
2:shell腳本的>>和>的各自作用
總結:
我們這里的隊列實現借助了服務器的計劃任務來實現,例如linux中的crontab,這本身是linux系統中的一個程序,平時我們還可以使用他來進行定時執行.sh腳本,例如將數據庫備份打包并ftp傳送到指定服務器上,這個功能不需要借助php腳本,直接用.sh腳本就可以實現。在這里我們巧妙的將crontab和php腳本結合,并且使用crontab來不斷調用一個隊列調度接口cronMission.php,再通過cronMission.php直接來控制具體什么時候或者是滿足什么條件來執行什么隊列任務。
這里面幾個需要注意的地方
1:往數據庫中存取數據時,不要直接使用json_encode或者json_decode,容易造成一些意外問題,在代碼中,我們定義了a2s和s2a兩個方法,分別是處理數組轉為字符串,和從數據庫中讀取字符串后轉為數組。
2:當任務量比較大,同時服務器負載又沒有充分利用的時候,可以使用多進程并發處理,在并發處理的時候需要考慮一個問題,就是如何避免重復,在這里我們使用了,對隊列任務進行標記,每次從數據庫中讀取一個進程需要處理的一批任務,使用數據庫中id與批次標示取余等于0的方法來區分,避免不同批次的隊列,重復處理相同任務。(上面步驟10中有具體實現)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/20761.html

相關文章

  • 總結javascript基礎概念():事件隊列循環

    摘要:而事件循環是主線程中執行棧里的代碼執行完畢之后,才開始執行的。由此產生的異步事件執行會作為任務隊列掛在當前循環的末尾執行。在下,觀察者基于監聽事件的完成情況在下基于多線程創建。 主要問題: 1、JS引擎是單線程,如何完成事件循環的? 2、定時器函數為什么計時不準確? 3、回調與異步,有什么聯系和不同? 4、ES6的事件循環有什么變化?Node中呢? 5、異步控制有什么難點?有什么解決方...

    zhkai 評論0 收藏0
  • 自己實現異步執行任務隊列(一)

    摘要:諸如此類,隊列的應用范圍是如此之廣。方案抽象到更高一層,開發一套通用異步處理隊列適用于任何復雜的業務邏輯那么,作為架構師,使用隊列的做法,將抽象層和業務層分離,可具有良好的擴展性和可維護性。 一、隊列使用場景:為什么需要隊列 在web開發中,我們經常會遇到需要處理批量任務的時候,這些批量任務可能是用戶提交的,也可能是當系統被某個事件觸發時需要進行批量處理的,面對這樣的任務,如果是用戶提...

    cucumber 評論0 收藏0
  • (轉)開源任務隊列服務HTQ

    摘要:可變隊列會對長期沒有更新動態的那部分不活躍用戶進行減緩速度,減緩對他們微博的獲取頻率,同時加大對活躍用戶的獲取頻率。 注:本文為轉載,原文請查看star7th的個人博客。 一、什么是 HTQ 先介紹下基本概念。 我們在編寫程序時,偶爾會遇到需要用到異步隊列的情況。比如說,我發送一萬封郵件,如果單純使用一個for循環來發送,則執行時間要很長,要等很久才能發完,同時很容易導致阻塞、超時等問...

    LMou 評論0 收藏0
  • 異步

    摘要:在異步機制中,任務隊列就是用來維護異步任務回調函數的隊列。四對象對象是工作組提出的一種規范,目的是為異步編程提供統一接口。 異步 1.JavaScript單線程的理解 Javascript語言的執行環境是單線程(single thread)。所謂單線程,就是指一次只能完成一件任務。如果有多個任務,就必須排隊,前面一個任務完成,再執行后面一個任務,以此類推。 2.JavaScript單線...

    goji 評論0 收藏0
  • js運行機制及異步編程(

    摘要:的執行機制就是一個主線程一個任務隊列。同步任務就是放在主線程上執行的任務,異步任務就是放在任務隊列的任務。和上述運行的機制主要說明的是,而的出現及普及,又有了新的概念,,它的出現,進一步,中分為兩種任務類型和,在中,稱為,可稱為。 上一篇文章主要整理了一下js引擎是如何工作的,這篇文章主要整理js的事件循環Event loop,以及異步編程的原理 事件循環Event loop 之前文章...

    nifhlheimr 評論0 收藏0

發表評論

0條評論

zr_hebo

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<