[#321574] Regular Expressions — Mmcolli00 Mom <mmc_collins@...>

Hi everyone.

15 messages 2008/12/01

[#321655] Ruby cgi script — ZippySwish <fischer.jan@...>

I put "script.rb" into the cgi-bin folder of my webhost, but nothing's

12 messages 2008/12/02

[#321733] FFI 0.2.0 — "Wayne Meissner" <wmeissner@...>

Greetings Rubyists.

20 messages 2008/12/03

[#321920] Force a program to stop if runtime exceeds given duration — Aldric Giacomoni <"aldric[remove]"@...>

Any idea how to do that?

25 messages 2008/12/04
[#321924] Re: Force a program to stop if runtime exceeds given duration — "Glen Holcomb" <damnbigman@...> 2008/12/04

On Thu, Dec 4, 2008 at 10:04 AM, Aldric Giacomoni <"aldric[remove]"@

[#322011] Re: Force a program to stop if runtime exceeds given duration — Ron Fox <fox@...> 2008/12/05

See http://www.ruby-doc.org/core-1.9/classes/Process.html#M003012

[#322016] Re: Force a program to stop if runtime exceeds given duration — Aldric Giacomoni <"aldric[remove]"@...> 2008/12/05

Everybody automatically assumes that rubyists are using Linux - sadly,

[#321969] Are there any Ruby Technical Writers here? — Vito Fontaine <vito.matro@...>

I am a beginner with Ruby who was interested in writing some programs.

15 messages 2008/12/04
[#321975] Re: Are there any Ruby Technical Writers here? — Robert Klemme <shortcutter@...> 2008/12/04

On 04.12.2008 22:43, Vito Fontaine wrote:

[#321984] Re: Are there any Ruby Technical Writers here? — Vito Fontaine <vito.matro@...> 2008/12/05

Robert Klemme wrote:

[#322014] Proximity searches in Ruby — Stuart Clarke <stuart.clarke1986@...>

Does Ruby have the ability to perform proximity searches on data. For

14 messages 2008/12/05
[#322056] Re: Proximity searches in Ruby — Ilan Berci <coder68@...> 2008/12/05

No proximity searches with 1.8.. you would need a full fledged text

[#322073] shoes 2 (raisins) is go. — _why <why@...>

Salutations and hi.

13 messages 2008/12/06

[#322260] Help on algorythm — Helder Oliveira <hrpoliveira@...>

Guys i have been trying to make this algorythm but with no sucess, can

13 messages 2008/12/09
[#322261] Re: Help on algorythm — "Glen Holcomb" <damnbigman@...> 2008/12/09

On Tue, Dec 9, 2008 at 7:44 AM, Helder Oliveira <hrpoliveira@gmail.com>wrote:

[#322283] Completely new programmer lacks direction — Cameron Carroll <ubernoobs@...>

Hi. I recently picked up a beginning ruby book, having only lightly

17 messages 2008/12/09

[#322285] compare 2 text files - check for difference - Please help — Mmcolli00 Mom <mmc_collins@...>

Hi. I want to take two files that are supposed to be identical, then ook

12 messages 2008/12/09
[#322301] Re: compare 2 text files - check for difference - Please help — Brian Candler <b.candler@...> 2008/12/09

Mmcolli00 Mom wrote:

[#322306] Re: compare 2 text files - check for difference - Please help — Mmcolli00 Mom <mmc_collins@...> 2008/12/09

require 'diff/lcs/Array'

[#322417] why Hash corrupts 'key' object ? — Dmitry Perfilyev <dmitry1976@...>

Hi, I have next script:

13 messages 2008/12/10

[#322464] Q: FFI and C++? — Jeremy Henty <onepoint@...>

If I want to wrap a C++ library using FFI, can it cope with the name

14 messages 2008/12/11

[#322516] Invoking Ruby code from a low-level language? — Alex Fulton <a.fulton@...>

Hi, my sincerest apologies if this question has already been answered

11 messages 2008/12/11

[#322529] parallel method return value — Louis-Philippe <default@...>

Hi all,

17 messages 2008/12/12

[#322566] How to run background processes (more than 1 worker) parallely. — "Deepak Gole" <deepak.gole8@...>

Hi

10 messages 2008/12/12

[#322624] singleton methods vs. meta instance methods — Daniel DeLorme <dan-ml@...42.com>

If I understand the ruby object model correctly, then an object's

15 messages 2008/12/13

[#322705] ruby 1.9.1: Encoding trouble: broken US-ASCII String — Tom Link <micathom@...>

Hi,

22 messages 2008/12/14

[#322710] Help with an "easy" regular expression substitution — Iñaki Baz Castillo <ibc@...>

Hi, I'm getting crazy to get a theorically easy substitution:

16 messages 2008/12/14

[#322819] Pure Ruby Zlib::GzipWriter — Daniel Berger <djberg96@...>

Hi,

53 messages 2008/12/15
[#323877] Re: Pure Ruby Zlib::GzipWriter — Daniel Berger <djberg96@...> 2009/01/03

[#323903] Re: Pure Ruby Zlib::GzipWriter — Roger Pack <rogerpack2005@...> 2009/01/04

[#324011] Re: Pure Ruby Zlib::GzipWriter — Daniel Berger <djberg96@...> 2009/01/05

[#324442] Re: Pure Ruby Zlib::GzipWriter — Luis Lavena <luislavena@...> 2009/01/10

On Jan 9, 9:26=A0pm, "Charles L." <aquas...@gmail.com> wrote:

[#322987] Using ruby hash on array — Stuart Clarke <stuart.clarke1986@...>

I would like to process some data from an array and using hash to

14 messages 2008/12/17

[#323085] Ruby and Rails supported on 10gen — "Jim Menard" <jim.menard@...>

http://www.10gen.com/blog/2008/12/ruby-support-on-10gen

11 messages 2008/12/18

[#323166] Dreaming of a Ruby Christmas (#187) — Matthew Moss <matt@...>

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

11 messages 2008/12/19

[#323204] get first and last line from txt file - how? — Mmcolli00 Mom <mmc_collins@...>

I have txt file with date/time stamps only. I want to grab the first

19 messages 2008/12/20
[#323205] Re: get first and last line from txt file - how? — Tim Hunter <TimHunter@...> 2008/12/20

Mmcolli00 Mom wrote:

[#323207] Re: get first and last line from txt file - how? — "Yaser Sulaiman" <yaserbuntu@...> 2008/12/20

I'm just wondering..

[#323273] how to make installing Ruby easier for amateurs — Tom Cloyd <tomcloyd@...>

Greetings!

21 messages 2008/12/22

[#323312] Name that data structure! — Simon Chiang <simon.a.chiang@...>

I'm using a data structure that I'm sure has been implemented and

18 messages 2008/12/22
[#323314] Re: Name that data structure! — "Gregory Brown" <gregory.t.brown@...> 2008/12/22

On Mon, Dec 22, 2008 at 5:38 PM, Simon Chiang <simon.a.chiang@gmail.com> wrote:

[#323342] Are all Ruby built-in objects thread safe? — "Just Another Victim of the Ambient Morality" <ihatespam@...>

Are all built-in objects thread safe? For example, if I have an array

23 messages 2008/12/23
[#323346] Re: Are all Ruby built-in objects thread safe? — Yukihiro Matsumoto <matz@...> 2008/12/23

Hi,

[#323519] What does 'Monkey Patching' exactly Mean in Ruby? — "Yaser Sulaiman" <yaserbuntu@...>

According to Wikipedia, a monkey patch[1] is:

36 messages 2008/12/27
[#323813] Re: What does 'Monkey Patching' exactly Mean in Ruby? — Jg W Mittag <JoergWMittag+Usenet@...> 2009/01/02

Phlip wrote:

[#323832] Re: What does 'Monkey Patching' exactly Mean in Ruby? — "David A. Black" <dblack@...> 2009/01/02

Hi --

[#323644] Why Ruby? — Mike Stephens <rubfor@...>

I have never seen or heard of Ruby in a corporate context. The single

35 messages 2008/12/30

[#323668] Ruby 1.9.1 RC1 is released — "Yugui (Yuki Sonoda)" <yugui@...>

Hi, folks

21 messages 2008/12/30

Re: How to run background processes (more than 1 worker) par

From: Jeff Moore <jcmoore@...>
Date: 2008-12-13 18:04:22 UTC
List: ruby-talk #322649
Deepak Gole wrote:
> Hi
> 
> Pls I need a help on above problem.*
> 
> 
> Thanks
> Deepak

Here's my approach to a similar problem. Still not as polished as I'd
like, but it maybe useful.

The core is the PoolQM class (the CircularBuffer class exists to catch
a limited number of exceptions).

=begin

NAME

  class CircularBuffer

DESCRIPTION

  A lightweight but (hopefully) thread-safe version of the circular 
buffer

  Designed primarily for intentionally limited in-memory event/error 
logging.

URI



INSTALL



HISTORY

  0.1

SYNOPSIS

  cb = CircularBuffer.new(50)     # create a new CircularBuffer that 
holds 50 nil elements
  cb << 'fnord'                   # append an element to the buffer
  elements = cb.to_a              # return elements as an array with 
elements ordered from oldest to newest
  cb.clear                        # force all entires to nil

CAVEATS

 The CircularBuffer ignores nil elements and ignores attempts to append 
them

2DOs



By Djief

=end

require 'thread'

class CircularBuffer

  def initialize(max_size)
    @max_size = max_size
    @ra = Array.new(@max_size, nil)
    @head = 0
    @mutex = Mutex.new
  end

  private

  def inc(index)
    (index +1) % @max_size
 end

  public

  # set all elements to nil
  #
  def clear
    @mutex.synchronize do
      @ra.collect! { |element| element = nil }
    end
  end

  # append a new element to the current 'end'
  #
  def <<(element)
    unless element.nil?
      @mutex.synchronize do
        @ra[@head]=element
        @head = inc(@head)
      end
    end
  end

  # return the entire buffer (except nil elements)
  # as an array
  #
  def to_a
    index = @head
    result = []
    @mutex.synchronize do
      @max_size.times do
        result << @ra[index] unless @ra[index].nil?
        index = inc(index)
      end
    end
    result
  end

end

=begin

NAME

  class PoolQM

DESCRIPTION

  PoolQM extends an Array with MonitorMixin to create a queue with
  an associated pool of worker threads that wait process any requests
  that are added to the queue.

  A dispatcher thread watches continuously for enqueued requests and
  signals idle worker threads (if any) to dequeue and process the
  request(s). If no idle workers exist, the request remains in the
  queue until one is available.

  During the creation of a new instance of PoolQM, the number of worker
  threads is established and the request processing block is defined:

    results = Queue.new
    NUM_OF_WORKERS = 10
    pqm = PoolQM.new(NUM_OF_WORKERS) do |request|
      results << "Current request: #{request}"    # processing request 
here
    end

  Note that any output you expect to collect from your worker threads 
should
  be returned via some thread-safe mechanism or container (Queue is a 
good
  default).

  Enqueuing a request is all that is necessary to initiate it's 
processing:

    pqm.enq("This is a test, this is only a test")

  If a request causes an exception within the processing block, the 
Exception
  is appended to a circular buffer whose contents can be obtained as an 
array
  with the PoolQM#exceptions method.

  If you're intested in logging exceptions, you'll have a bit more work 
to
  do but replacing the CircularBuffer with a Queue that has it's own 
worker
  to handle disk IO is probably a good bet.

  Performance-wise this approach behaves more consistently than any I've
  produced so far i.e. it's both fast and performs with repeatable 
uniformity.

  No doubt, there's still room for improvement.


URI



INSTALL



HISTORY

  0.1 - genesis
  0.2 - documentation and clean-up

SYNOPSIS

  require 'thread'

  results = Queue.new                           # thread-safe container 
for results! <<<<<<<<<< IMPORTANT

  NUM_OF_WORKERS = 10

  pqm = PoolQM.new(NUM_OF_WORKERS) do |request|
    results << "Current request: #{request}"    # processing request 
here
  end

  100.times do |index|
    pqm.enq("Request number #{index}")          # enqueuing requests 
here
  end

  pqm.wait_until_idle                            # wait for all requests 
to be processed

  until results.empty? do                       # dump results
    p results.pop
  end

  pqm.exceptions.each do |exception|            # obtain exceptions 
array and dump it
    p exception
  end

CAVEATS



2DOs



By Djief

=end


require 'monitor'

class PoolQM

  # default size for the exceptions CircularBuffer
  #
  DEFAULT_EXCEPTION_BUFFER_SIZE = 10

  # Create a new PoolQM with 'worker_count' worker threads to execute
  # the associated block
  #
  def initialize(worker_count = 1)
    raise 'block required: { |request| ... }' unless block_given?
    @worker_count = worker_count
    @request_q = []
    @request_q.extend(MonitorMixin)
    @request_ready = @request_q.new_cond
    @exceptions = CircularBuffer.new(DEFAULT_EXCEPTION_BUFFER_SIZE)
    @worker_count.times do
      Thread.new do
        loop do
          request = nil
          @request_q.synchronize do
            @request_ready.wait
            request = @request_q.delete_at(0)
          end
          begin
            yield request
          rescue Exception => e
            @exceptions << e
          end
          Thread.pass
        end
      end
    end
    @dispatcher = Thread.new do
      loop do
        @request_q.synchronize do
          @request_ready.signal unless @request_q.empty? || 
@request_ready.count_waiters == 0
        end
        Thread.pass
      end
    end

  end

  # enq the request data
  #
  def enq(request)
    @request_q.synchronize do
      @request_q << request
    end
  end

  # Wait until all the queued requests have been removed
  # from the request_q && then wait until all threads have
  # compeleted their processing and are idle
  #
  def wait_until_idle(wait_resolution=0.3)
    q_empty = false
    until q_empty
      @request_q.synchronize do
        q_empty = @request_q.empty?
      end
      sleep(wait_resolution) unless q_empty
    end
    all_threads_idle = false
    until all_threads_idle
      @request_q.synchronize do
        all_threads_idle = @request_ready.count_waiters == @worker_count
      end
      sleep(wait_resolution) unless all_threads_idle
    end
  end

  # create a new exceptions buffer of new_size
  #
  def exceptions_buffer_size=(new_size)
    @exceptions = CircularBuffer.new(new_size)
  end

  # report the size of the current exceptions buffer
  #
  def exceptions_buffer_size
    @exceptions.size
  end

  # return the current exceptions buffer as an ordered Array
  #
  def exceptions
    @exceptions.to_a
  end

end

if __FILE__ == $0

  # the usual trivial example

  require 'thread'

  # >>>> thread-safe container for result <<<<
  #
  results = Queue.new

  NUM_OF_WORKERS = 10

  pqm = PoolQM.new(NUM_OF_WORKERS) do |request|
    raise "Dummy Exception during #{request}" if rand(10) == 0  # 
simulate random exceptions
    results << "Current request: #{request}"    # processing request 
here
  end

  100.times do |index|
    pqm.enq("Request number #{index}")            # enqueuing requests 
here
  end

  # wait for all requests to be processed
  pqm.wait_until_idle

  # dump results
  until results.empty? do
    p results.pop
  end

  # obtain exceptions array and dump it
  pqm.exceptions.each do |exception|
    p exception
  end

end


Regards,

djief
-- 
Posted via http://www.ruby-forum.com/.

In This Thread