[#71439] [Ruby trunk - Feature #11339] [PATCH] io.c: avoid kwarg parsing in C API — matz@...
Issue #11339 has been updated by Yukihiro Matsumoto.
7 messages
2015/11/11
[#71473] Re: [Ruby trunk - Feature #11339] [PATCH] io.c: avoid kwarg parsing in C API
— Eric Wong <normalperson@...>
2015/11/13
Entire series for sockets
[#71450] Ruby 2.3.0-preview1 Released — "NARUSE, Yui" <naruse@...>
Hi,
5 messages
2015/11/11
[#71617] [Ruby trunk - Feature #11664] [PATCH] introduce rb_autoload_value to replace rb_autoload — nobu@...
Issue #11664 has been updated by Nobuyoshi Nakada.
3 messages
2015/11/20
[#71721] [Ruby trunk - Feature #11741] Migrate Ruby to Git from Subversion — me@...
Issue #11741 has been updated by Jon Moss.
4 messages
2015/11/28
[ruby-core:71620] [Ruby trunk - Feature #10600] [PATCH] Queue#close
From:
ko1@...
Date:
2015-11-21 00:29:51 UTC
List:
ruby-core #71620
Issue #10600 has been updated by Koichi Sasada.
I decide to reduce specification of Queue#close. For closed queues, deq returns nil.
No exception is raised for deq.
Other tokens are also not supported.
We can introduce them as new feature.
For Ruby 2.3 (or just now), Queue#close is only for shortcut of such common case.
```ruby
consumer_threads = (1..3).map{
Thread.new do
while e = q.pop
do_something e
end
end
}
q.push 1
q.push 2
3.times{
q.push nil # terminater
}
```
We can write last 3 lines with:
```ruby
q.close
```
I agree that it is reasonable to add options (raise exception, and so on) to Queue.new.
We can add this feature later.
----------------------------------------
Feature #10600: [PATCH] Queue#close
https://bugs.ruby-lang.org/issues/10600#change-55021
* Author: John Anderson
* Status: Assigned
* Priority: Normal
* Assignee: Koichi Sasada
----------------------------------------
In a multiple-producer / multiple-consumer situation using blocking enq and deq, closing a queue cleanly is difficult. It's possible using a queue poison token, but unpleasant because either producers have to know how to match up number of poison tokens with number of consumers, or consumers have to keep putting the poison back into the queue which complicates testing for empty and not blocking on deq.
This patch (from trunk at b2a128f) implements Queue#close which will close the queue to producers, leaving consumers to deq the remaining items. Once the queue is both closed and empty, consumers will not block. When an empty queue is closed, all consumers blocking on deq will be woken up and given nil.
With Queue#close, clean queue shutdown is simple:
~~~ ruby
queue = SizedQueue.new 1000
consumer_threads = lots_of.times.map do
Thread.new do
while item = queue.pop
do_work item
end
end
end
source = somewhat_async_enumerator
producer_threads = a_few.times.map do
Thread.new do
loop{queue << source.next}
end
end
producer_threads.each &:join
queue.close
consumer_threads.each &:join
~~~
---Files--------------------------------
queue-close.diff (5.18 KB)
queue-close-2.diff (10.2 KB)
patch-25f99aef.diff (25.2 KB)
queue_benchmark.rb (2.95 KB)
--
https://bugs.ruby-lang.org/