類別 Thread::SizedQueue
此類別表示指定大小容量的佇列。如果容量已滿,則推入操作可能會被封鎖。
請參閱 Thread::Queue
,了解 Thread::SizedQueue
的運作方式範例。
公開類別方法
new(max) 按一下以切換來源
建立一個固定長度的佇列,其最大大小為 max
。
static VALUE rb_szqueue_initialize(VALUE self, VALUE vmax) { long max; struct rb_szqueue *sq = szqueue_ptr(self); max = NUM2LONG(vmax); if (max <= 0) { rb_raise(rb_eArgError, "queue size must be positive"); } RB_OBJ_WRITE(self, szqueue_list(sq), ary_buf_new()); ccan_list_head_init(szqueue_waitq(sq)); ccan_list_head_init(szqueue_pushq(sq)); sq->max = max; return self; }
公開實例方法
clear() 按一下以切換來源
從佇列中移除所有物件。
static VALUE rb_szqueue_clear(VALUE self) { struct rb_szqueue *sq = szqueue_ptr(self); rb_ary_clear(check_array(self, sq->q.que)); wakeup_all(szqueue_pushq(sq)); return self; }
close 按一下以切換來源
類似於 Thread::Queue#close
。
不同之處在於等待佇列執行緒的行為。
如果存在等待佇列執行緒,則會透過引發 ClosedQueueError(‘queue closed’) 來中斷它們。
static VALUE rb_szqueue_close(VALUE self) { if (!queue_closed_p(self)) { struct rb_szqueue *sq = szqueue_ptr(self); FL_SET(self, QUEUE_CLOSED); wakeup_all(szqueue_waitq(sq)); wakeup_all(szqueue_pushq(sq)); } return self; }
deq
別名:pop
empty? 按一下以切換來源
如果佇列為空,則傳回 true
。
static VALUE rb_szqueue_empty_p(VALUE self) { struct rb_szqueue *sq = szqueue_ptr(self); return RBOOL(queue_length(self, &sq->q) == 0); }
freeze 按一下以切換來源
佇列無法凍結,因此此方法會引發例外狀況
Thread::Queue.new.freeze # Raises TypeError (cannot freeze #<Thread::Queue:0x...>)
static VALUE rb_queue_freeze(VALUE self) { rb_raise(rb_eTypeError, "cannot freeze " "%+"PRIsVALUE, self); UNREACHABLE_RETURN(self); }
length 按一下以切換來源
size
傳回佇列長度。
static VALUE rb_szqueue_length(VALUE self) { struct rb_szqueue *sq = szqueue_ptr(self); return LONG2NUM(queue_length(self, &sq->q)); }
別名:size
max() 按一下以切換來源
傳回佇列的最大大小。
static VALUE rb_szqueue_max_get(VALUE self) { return LONG2NUM(szqueue_ptr(self)->max); }
max=(number) 按一下以切換來源
將佇列的最大大小設定為指定的 number
。
static VALUE rb_szqueue_max_set(VALUE self, VALUE vmax) { long max = NUM2LONG(vmax); long diff = 0; struct rb_szqueue *sq = szqueue_ptr(self); if (max <= 0) { rb_raise(rb_eArgError, "queue size must be positive"); } if (max > sq->max) { diff = max - sq->max; } sq->max = max; sync_wakeup(szqueue_pushq(sq), diff); return vmax; }
num_waiting() 按一下以切換來源
傳回在佇列上等待的執行緒數目。
static VALUE rb_szqueue_num_waiting(VALUE self) { struct rb_szqueue *sq = szqueue_ptr(self); return INT2NUM(sq->q.num_waiting + sq->num_waiting_push); }
pop(non_block=false, timeout: nil) 按一下以切換來源
從佇列中擷取資料。
如果佇列為空,呼叫執行緒會暫停,直到資料推入佇列中。如果 non_block
為 true,執行緒不會暫停,且會引發 ThreadError
。
如果已過 timeout
秒且沒有資料可用,會傳回 nil
。如果 timeout
為 0
,則會立即傳回。
# File thread_sync.rb, line 36 def pop(non_block = false, timeout: nil) if non_block && timeout raise ArgumentError, "can't set a timeout if non_block is enabled" end Primitive.rb_szqueue_pop(non_block, timeout) end
push(object, non_block=false, timeout: nil) 按一下以切換來源
將 object
推入佇列。
如果佇列中沒有剩餘空間,會等到有空間可用為止,除非 non_block
為 true。如果 non_block
為 true,執行緒不會暫停,且會引發 ThreadError
。
如果已過 timeout
秒且沒有可用空間,會傳回 nil
。如果 timeout
為 0
,則會立即傳回。否則會傳回 self
。
# File thread_sync.rb, line 59 def push(object, non_block = false, timeout: nil) if non_block && timeout raise ArgumentError, "can't set a timeout if non_block is enabled" end Primitive.rb_szqueue_push(object, non_block, timeout) end
shift
別名:pop