class Thread::SizedQueue
Diese Klasse repräsentiert Warteschlangen mit einer bestimmten Kapazität. Die push-Operation kann blockiert werden, wenn die Kapazität voll ist.
Siehe Thread::Queue für ein Beispiel, wie eine Thread::SizedQueue funktioniert.
Öffentliche Klassenmethoden
Source
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;
}
Erstellt eine Warteschlange mit fester Länge und einer maximalen Größe von max.
Öffentliche Instanzmethoden
Source
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;
}
Entfernt alle Objekte aus der Warteschlange.
Source
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;
}
Ähnlich wie Thread::Queue#close.
Der Unterschied liegt im Verhalten bei wartenden Threads, die Elemente einfügen.
Wenn wartende Threads Elemente einfügen, werden sie durch Auslösen von ClosedQueueError(‘queue closed’) unterbrochen.
Source
static VALUE
rb_szqueue_max_get(VALUE self)
{
return LONG2NUM(szqueue_ptr(self)->max);
}
Gibt die maximale Größe der Warteschlange zurück.
Source
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;
}
Setzt die maximale Größe der Warteschlange auf die gegebene number.
Source
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);
}
Gibt die Anzahl der Threads zurück, die auf die Warteschlange warten.
Source
# File thread_sync.rb, line 38 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
Ruft Daten aus der Warteschlange ab.
Wenn die Warteschlange leer ist, wird der aufrufende Thread ausgesetzt, bis Daten in die Warteschlange eingefügt werden. Wenn non_block true ist, wird der Thread nicht ausgesetzt und ThreadError wird ausgelöst.
Wenn timeout Sekunden vergangen sind und keine Daten verfügbar sind, wird nil zurückgegeben. Wenn timeout 0 ist, wird sofort zurückgegeben.
Source
# File thread_sync.rb, line 61 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
Fügt object in die Warteschlange ein.
Wenn kein Platz mehr in der Warteschlange ist, wird gewartet, bis Platz verfügbar ist, es sei denn, non_block ist true. Wenn non_block true ist, wird der Thread nicht ausgesetzt und ThreadError wird ausgelöst.
Wenn timeout Sekunden vergangen sind und kein Platz verfügbar ist, wird nil zurückgegeben. Wenn timeout 0 ist, wird sofort zurückgegeben. Andernfalls wird self zurückgegeben.