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 表可以看作是乙個佇列,每一行為乙個元素。每次查詢得到滿足某個條件的最前面的一行,並將...