concurrent-ruby icon indicating copy to clipboard operation
concurrent-ruby copied to clipboard

Add keyword arguments to async

Open reeganviljoen opened this issue 1 year ago • 1 comments

Feature request

Add support for keyword arguments when using async

From the docs

class Echo
  include [Concurrent](https://ruby-concurrency.github.io/concurrent-ruby/1.2.3/Concurrent.html)::Async

  def echo(msg)
    print "#{msg}\n"
  end
end

horn = Echo.new
horn.echo('zero')      # synchronous, not thread-safe
                       # returns the actual return value of the method

horn.async.echo('one') # asynchronous, non-blocking, thread-safe
                       # returns an IVar in the :pending state

horn.await.echo('two') # synchronous, blocking, thread-safe

but if i modify it to use named arguments like so it doesn't work

class Echo
  include [Concurrent](https://ruby-concurrency.github.io/concurrent-ruby/1.2.3/Concurrent.html)::Async

  def echo(msg: )
    print "#{msg}\n"
  end
end

horn = Echo.new
horn.echo(msg: zero')      # synchronous, not thread-safe
                       # returns the actual return value of the method

horn.async.echo(msg: 'one') # asynchronous, non-blocking, thread-safe
                       # returns an IVar in the :pending state

horn.await.echo(msg: 'two') # synchronous, blocking, thread-safe

#when I try to get the value 
horn.await.echo(msg: 'two').value #nil
horn.await.echo(msg: 'two').reason #<ArgumentError: wrong number of arguments (given 1, expected 0)>

I appreciate any future feedback from the maintainers on this 🙏

System information

* Operating system:                mac
* Ruby implementation:             Ruby
* `concurrent-ruby` version:       1,2,3
* `concurrent-ruby-ext` installed: no
* `concurrent-ruby-edge` used:     no

reeganviljoen avatar Feb 11 '24 16:02 reeganviljoen

There is nothing wrong to get nil from value. Because print just write to STDOUT and return nil

And I can not reproduce ArgumentError from reason. Would you try that again ?

turnon avatar Feb 23 '24 01:02 turnon

I have same error in Ruby 3.0.3, concurrent-ruby 1.3.4.

class Echo1
  include Singleton
  include Concurrent::Async

  def echo(msg)
    puts msg
  end
end

def _a(echoer)
  p echoer.class
  echoer.async.echo('A')
end

and _a Echo1.instance output is:

Echo1
#<Concurrent::IVar:0x000056139ac49d58
@__Condition__=#<Thread::ConditionVariable:0x000056139ac383a0>,
@__Lock__=#<Thread::Mutex:0x000056139ac3a2e0>,
@copy_on_deref=nil,
@do_nothing_on_deref=true,
@dup_on_deref=nil,
@event=#<Concurrent::Event:0x000056139ac10e18 @__Condition__=#<Thread::ConditionVariable:0x000056139ac27af0>, @__Lock__=#<Thread::Mutex:0x000056139ac10198>, @iteration=0, @set=true>,
@freeze_on_deref=nil,
@observers=#<Concurrent::Collection::CopyOnWriteObserverSet:0x000056139ac26650 @__Condition__=#<Thread::ConditionVariable:0x000056139ac24ee0>, @__Lock__=#<Thread::Mutex:0x000056139ac251b0>, @observers={}>,
@reason=nil,
@state=:fulfilled,
@value=nil>

(works fine)

class Echo2
  include Singleton
  include Concurrent::Async

  def echo(msg:)
    puts msg
  end
end

def _b0(echoer)
  p echoer.class
  echoer.echo(msg: 'B0')
end

def _b1(echoer)
  p echoer.class
  echoer.async.echo(msg: 'B1')
end

_b0 Echo2.instance output is:

Echo2
B0

(works fine)

and _b1 Echo2.instance output is:

Echo2
=> #<Concurrent::IVar:0x00005613a431bad8
 @__Condition__=#<Thread::ConditionVariable:0x00005613a431b628>,
 @__Lock__=#<Thread::Mutex:0x00005613a431b650>,
 @copy_on_deref=nil,
 @do_nothing_on_deref=true,
 @dup_on_deref=nil,
 @event=#<Concurrent::Event:0x00005613a431b1f0 @__Condition__=#<Thread::ConditionVariable:0x00005613a431b128>, @__Lock__=#<Thread::Mutex:0x00005613a431b1a0>, @iteration=0, @set=true>,
 @freeze_on_deref=nil,
 @observers=#<Concurrent::Collection::CopyOnWriteObserverSet:0x00005613a431afe8 @__Condition__=#<Thread::ConditionVariable:0x00005613a431aef8>, @__Lock__=#<Thread::Mutex:0x00005613a431af20>, @observers={}>,
 @reason=#<ArgumentError: wrong number of arguments (given 1, expected 0; required keyword: msg)>,
 @state=:rejected,
 @value=nil>

where @reason has error.

romiras avatar Oct 15 '24 10:10 romiras

Could you start a PR to fix and add specs for this? It's probably just using *args somewhere without ruby2_keywords.

eregon avatar Oct 15 '24 10:10 eregon

@eregon I should have some time near the end of the weak if no else picks this up

reeganviljoen avatar Oct 15 '24 11:10 reeganviljoen

ok, I hope it's not a big deal.

romiras avatar Nov 14 '24 16:11 romiras