bruno- / fiber_scheduler

Ruby's missing Fiber Scheduler implementation.
MIT License
119 stars 5 forks source link

`io_read': wrong number of arguments (given 4, expected 3) (ArgumentError) #8

Open EdwardDiehl opened 11 months ago

EdwardDiehl commented 11 months ago
# fibers_test.rb

require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'fiber_scheduler', '~> 0.13.0'
end

require 'net/http'
require 'fiber_scheduler'

require 'benchmark'

Benchmark.realtime do
  Thread.new do # in this thread, we'll have non-blocking fibers
    Fiber.set_scheduler(FiberScheduler.new)

    (1..3).each do |user_id|
      Fiber.schedule do
        t = Time.now
        Net::HTTP.get('reqres.in', "/api/users/#{user_id}?delay=2")
        puts 'User %s: finished in %.3f' % [user_id, Time.now - t]
      end
    end
  end.join
end

This is the result of running the script

$ ruby ./fibers_test.rb 
#<Thread:0x00007fefaee35c60 ./fibers_test.rb:14 run> terminated with exception (report_on_exception is true):
/home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler.rb:175:in `io_read': Failed to open TCP connection to reqres.in:80 (wrong number of arguments (given 4, expected 3)) (ArgumentError)
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:193:in `each'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:193:in `block (2 levels) in lazy_initialize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:192:in `open'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:192:in `block in lazy_initialize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:188:in `synchronize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:188:in `lazy_initialize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:236:in `each_address'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:116:in `block in each_address'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:115:in `each'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:115:in `each_address'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:102:in `getaddresses'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:51:in `getaddresses'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler.rb:164:in `address_resolve'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1271:in `initialize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1271:in `open'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1271:in `block in connect'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler/timeouts.rb:55:in `timeout'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler.rb:188:in `timeout_after'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/timeout.rb:178:in `timeout'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1269:in `connect'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1248:in `do_start'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1237:in `start'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:474:in `get_response'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:461:in `get'
    from ./fibers_test.rb:20:in `block (4 levels) in <main>'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler.rb:240:in `block in fiber'
/home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler.rb:175:in `io_read': wrong number of arguments (given 4, expected 3) (ArgumentError)
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:193:in `each'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:193:in `block (2 levels) in lazy_initialize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:192:in `open'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:192:in `block in lazy_initialize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:188:in `synchronize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:188:in `lazy_initialize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:236:in `each_address'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:116:in `block in each_address'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:115:in `each'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:115:in `each_address'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:102:in `getaddresses'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:51:in `getaddresses'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler.rb:164:in `address_resolve'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1271:in `initialize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1271:in `open'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1271:in `block in connect'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler/timeouts.rb:55:in `timeout'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler.rb:188:in `timeout_after'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/timeout.rb:178:in `timeout'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1269:in `connect'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1248:in `do_start'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1237:in `start'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:474:in `get_response'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:461:in `get'
    from ./fibers_test.rb:20:in `block (4 levels) in <main>'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler.rb:240:in `block in fiber'
/home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler.rb:175:in `io_read': Failed to open TCP connection to reqres.in:80 (wrong number of arguments (given 4, expected 3)) (ArgumentError)
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:193:in `each'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:193:in `block (2 levels) in lazy_initialize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:192:in `open'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:192:in `block in lazy_initialize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:188:in `synchronize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:188:in `lazy_initialize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:236:in `each_address'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:116:in `block in each_address'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:115:in `each'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:115:in `each_address'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:102:in `getaddresses'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:51:in `getaddresses'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler.rb:164:in `address_resolve'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1271:in `initialize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1271:in `open'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1271:in `block in connect'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler/timeouts.rb:55:in `timeout'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler.rb:188:in `timeout_after'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/timeout.rb:178:in `timeout'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1269:in `connect'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1248:in `do_start'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1237:in `start'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:474:in `get_response'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:461:in `get'
    from ./fibers_test.rb:20:in `block (4 levels) in <main>'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler.rb:240:in `block in fiber'
/home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler.rb:175:in `io_read': wrong number of arguments (given 4, expected 3) (ArgumentError)
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:193:in `each'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:193:in `block (2 levels) in lazy_initialize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:192:in `open'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:192:in `block in lazy_initialize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:188:in `synchronize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:188:in `lazy_initialize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:236:in `each_address'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:116:in `block in each_address'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:115:in `each'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:115:in `each_address'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:102:in `getaddresses'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/resolv.rb:51:in `getaddresses'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler.rb:164:in `address_resolve'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1271:in `initialize'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1271:in `open'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1271:in `block in connect'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler/timeouts.rb:55:in `timeout'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler.rb:188:in `timeout_after'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/timeout.rb:178:in `timeout'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1269:in `connect'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1248:in `do_start'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:1237:in `start'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:474:in `get_response'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/net/http.rb:461:in `get'
    from ./fibers_test.rb:20:in `block (4 levels) in <main>'
    from /home/username/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/fiber_scheduler-0.13.0/lib/fiber_scheduler.rb:240:in `block in fiber'
$ ruby -v
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-linux]

The script works fine with Async::Scheduler from async-io gem

paddor commented 9 months ago

@bruno- Can you make a new release? That would fix this issue.

taq commented 7 months ago

I think this project is pretty dead, better use async-io. I'd just like to know if @bruno- is ok.

keithrbennett commented 1 month ago

Confirmed, as of 2024-08-27, this bug still exists.