mysql 佇列 MySQL佇列 預設佇列

2021-10-25 14:24:53 字數 3086 閱讀 9253

mysql佇列(預設佇列)

在隊列表中主要用到的幾個字段(隊列表是在base/dbschema/queue.php中定義),具體的可以去檢視

queue_id

queue_title

status

start_time

worker

cursor_id

params

runkey

主要字段說明queue_id 佇列id 在執行佇列的時候是唯一標識

queue_title 佇列標題,直觀區分佇列

status 佇列狀態(running/執行中,hibernate/休眠中,paused/已暫停,failure/執行失敗)

start_time 佇列產生時間

worker 在執行佇列的時候會根據worker這個字段表示該佇列在哪個方法執行

cursor_id 游標--對於乙個佇列中有多個任務需要用到此欄位

params 引數(引數,通常就是filter)

runkey 佇列執行的key,通常不需要自定義

在ecos後台系統的後台會每30秒會呼叫如下位址

在desktop_ctl_default的status方法中會調

function status(){

跳到base的queue model中

var$limit=100;//最大任務併發var$task_timeout=300;//單次任務超時functionflush(){$base_url=kernel::base_url();

foreach($this->db->select('select queue_id from sdb_base_queue limit '.$this->limit) as$r){$this->runtask($r['queue_id']);

functionruntask($task_id){$http= newbase_httpclient;$_post['task_id'] =$task_id;$url=kernel::openapi_url('openapi.queue','worker',array('task_id'=>$task_id));kernel::log('spawn [task-'.$task_id.'] '.$url);//99%概率不會有問題$http->hostaddr=$_server["server_addr"]?$_server["server_addr"]:'127.0.0.1';$http->hostport=$_server["server_port"]?$_server["server_port"]:'80';$http->timeout=2;kernel::log($http->post($url,$_post));

從**中可以看到在這獲取到存放在隊列表中的佇列任務,進行執行

根據 kernel::openapi_url('openapi.queue','worker',array('task_id'=>$task_id));

知道呼叫了base_service_queue類的worker方法

呼叫base_service_queue的worker方法function worker(){

list($worker,$method) = explode('.',$task_info['worker']);

$errmsg = null;

$obj_work = kernel::single($worker);

$remaining = call_user_func_array( array( $obj_work ,$method),array(&$task_info['cursor_id'],$task_info['params'], &$errmsg));

從以上**可以看出:執行佇列的方法是佇列worker欄位的值。

eg'worker'=>'b2c_queue.send_msg',表示在b2c_queue類中的send_msg方法中執行此佇列

從worker方法中可以看出,在向執行佇列的方法中會傳入cursor_id,params兩個引數

如果在乙個佇列中只有乙個任務,如上則在執行完乙個任務後需要返回乙個false,則會刪除此佇列.

如果有乙個佇列中有多個任務,則會根據游標(cursor_id)進行完成任務,只要佇列還沒執行完成,

返回true則會跟新游標(cursor_id)直到返回false,再刪除佇列

如下是ecos後台中**訊息的乙個佇列

在ecos中每個佇列都是放在sdb_base_queue這個隊列表中,所以在插入佇列的時候需要把佇列資訊插入到

隊列表中即可//可迴圈插入佇列

$data = array(

'start_time'=>time(),

'params'=>array(

'member_id'=>$data['member_id'],

'data' =>$atmp,

'name' => $login_name,

'gnotify_id' => $gnid,

'worker'=>'b2c_queue.send_msg',

if(!$queue->insert($data)){

新建b2c_queue類,寫send_msg方法來執行此佇列

function send_msg(&$cursor_id,$params){

$obj_memmsg = kernel::single('b2c_message_msg');

$adata = $params['data'];

$adata['member_id'] = 1;

$adata['to_id'] = $params['member_id'];

$adata['msg_to'] = $params['name'];

$adata['subject'] = $adata['title'];

$adata['comment'] = $adata['content'];

$adata['has_sent'] = 'true';

$obj_memmsg->send($adata);

注意執行完乙個佇列,需要返回乙個false

mysql迴圈佇列 資料結構 迴圈佇列

資料結構 迴圈佇列 寫在前面 陣列表示的問題 對於佇列最好的方法是使用鍊錶實現,因為對於陣列來說,佇列可能會出現下面這種情況 如圖所示,不可以繼續新增元素,否則會造成陣列越界而遭致程式出錯。然而此時又不應該擴充陣列,因為還有大量實際空間未被占用。此時我們應該如何解決這個問題呢?我們將其實現為迴圈佇列...

mySQL無鎖佇列 go 無鎖佇列

無鎖佇列適用場景 兩個執行緒之間的互動資料,乙個執行緒生產資料,另外乙個執行緒消費資料,效率高 缺點 需要使用固定分配的空間,不能動態增加 減少長度,存在空間浪費和無法擴充套件空間問題 package main import fmt reflect strings time type loopque...

mysql 佇列 實現併發讀

佇列是常用的資料結構,基本特點就是先入先出,在事務處理等方面都要用到它,有的時候是帶有優先順序的佇列。當佇列存在併發訪問的時候,比如多執行緒情況下,就需要鎖機制來保證佇列中的同乙個元素不被多次獲取 乙個 mysql 表可以看作是乙個佇列,每一行為乙個元素。每次查詢得到滿足某個條件的最前面的一行,並將...