Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add keyword arguments to async #1040

Open
reeganviljoen opened this issue Feb 11, 2024 · 5 comments
Open

Add keyword arguments to async #1040

reeganviljoen opened this issue Feb 11, 2024 · 5 comments

Comments

@reeganviljoen
Copy link

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
@turnon
Copy link
Contributor

turnon commented Feb 23, 2024

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 ?

@romiras
Copy link

romiras commented Oct 15, 2024

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.

@eregon
Copy link
Collaborator

eregon commented Oct 15, 2024

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

@reeganviljoen
Copy link
Author

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

@romiras
Copy link

romiras commented Nov 14, 2024

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants