From: "brixen (Brian Ford)" <brixen@...>
Date: 2012-07-20T22:42:40+09:00
Subject: [ruby-dev:45985] [ruby-trunk - Feature #6694] Thread.new without block.


Issue #6694 has been updated by brixen (Brian Ford).


ko1 (Koichi Sasada) wrote:
> (2012/07/20 15:32), brixen (Brian Ford) wrote:
>  > 
>  > I object to this API for at least the two following reasons:
>  > 
>  > 1. Stack size is an implementation detail and coupling Ruby code to details of a particular implementation is undesirable. Applications may be developed on one implementation and deployed on another. Or details affecting stack size may change between versions of a single implementation.
>  > 2. Stack size may depend on code not in the application or library (eg a library using Thread.new that calls application code or application code that different versions or implementations of a library).
>  > 
>  > This setting should be a configuration option, not a Ruby method API.
>  
>  Maybe you mention to this ticket, don't you?
>  https://bugs.ruby-lang.org/issues/6695
>  
>  This ticket only propose thread configuration before thread creation.

I don't think I understand your question. To summarize my objection to this proposed API change: Thread stack size should be something set at the VM level completely outside of Ruby code. Ruby code should not be coupled with implementation details.

Cheers,
Brian

----------------------------------------
Feature #6694: Thread.new without block.
https://bugs.ruby-lang.org/issues/6694#change-28226

Author: ko1 (Koichi Sasada)
Status: Assigned
Priority: Normal
Assignee: ko1 (Koichi Sasada)
Category: core
Target version: 2.0.0


=begin
= Abstract

Support Thread.new() without block.

Before: Thread.new(params...){|thread_local_params| ...}

After: Thread.new(proc: lambda{|tl_params...| ...}, args: params..., other_thread_config...)

= Background

Thread.new creates new Thread object and run passed block in another thread immediately.  Thread.new can receive parameters and pass all parameters to block.

  Thread.new(a, b, c) do |ta, tb, tc|
    # ta, tb, tc is thread local
  }

There are some request to specify thread configurations such as stack size described in [Ruby 1.9 - Feature #3187] (in this case, stack size for Fiber.new).  However, we have no way to pass such thread configuration on the Thread.new().

= Proposal

Allow Thread.new() without block.  A block will be passed with proc parameter.  Passed arguments will be passed with args parameter.

  # ex1
  Thread.new(){...}
  #=>
  Thread.new(proc: -> {...})
  
  # ex2
  Thread.new(a, b, c){|ta, tb, tc| ...}
  #=>
  Thread.new(proc: ->(ta, tb, tc){ ... }, params: [a, b, c])

If you want to specify stack size, then:

  Thread.new(stack_size: 4096, proc: proc{...}, args: [a, b, c])

Note that I'll make another ticket for thread (and fiber) creation parameters.

This change can be described with the following pseudo code:

  def Thread.new(*args, &block)
    if block
      Thread.new_orig(*args, &block)
    else
      config = args[0] || raise ArgumentError
      stack_size = config[:stack_size]
      # ... and process another parameters 
      Thread.new_orig(*config[:args], &config[:proc])
    end
  end

= Another proposal

On the [ruby-core:43385], Nahi-san proposed that if no block given on Thread.new(), then create "waiting" thread.  Thread#run kicks waiting thread with parameters.

  th = Thread.new(thread_config_params)
  ...
  th.run(params){|thread_local_params|
    ...
  }

We can combine with proc: parameter and this proposal.  If Thread.new() doesn't have block and proc: parameter, then making a waiting thread.

NOTE: Because we have already Thread#run, Thread#start is better than Thread#run?


= Note

I don't make any survey on other languages.  Please give us your comments.

=end



-- 
http://bugs.ruby-lang.org/