polyphony 0.23 → 0.24
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +4 -10
- data/README.md +0 -4
- data/TODO.md +5 -56
- data/docs/README.md +4 -7
- data/examples/core/{channel_echo.rb → xx-channels.rb} +0 -0
- data/examples/core/{defer.rb → xx-deferring-an-operation.rb} +0 -0
- data/examples/core/{genserver.rb → xx-erlang-style-genserver.rb} +2 -2
- data/examples/core/{fork.rb → xx-forking.rb} +2 -0
- data/examples/core/xx-move_on.rb +23 -0
- data/examples/core/{pulse.rb → xx-recurrent-timer.rb} +3 -2
- data/examples/core/{resource_cancel.rb → xx-resource_cancel.rb} +1 -2
- data/examples/core/{resource_delegate.rb → xx-resource_delegate.rb} +0 -0
- data/examples/core/{wait_for_signal.rb → xx-signals.rb} +0 -0
- data/examples/core/{sleep.rb → xx-sleeping.rb} +0 -0
- data/examples/core/{spin_error_backtrace.rb → xx-spin_error_backtrace.rb} +5 -2
- data/examples/core/{supervisor.rb → xx-supervisors.rb} +0 -0
- data/examples/core/{thread_cancel.rb → xx-thread_cancel.rb} +0 -0
- data/examples/core/{thread_pool.rb → xx-thread_pool.rb} +0 -0
- data/examples/core/{throttle.rb → xx-throttling.rb} +0 -0
- data/examples/core/{timeout.rb → xx-timeout.rb} +0 -0
- data/examples/core/{lock.rb → xx-using-a-mutex.rb} +0 -0
- data/examples/io/{backticks.rb → xx-backticks.rb} +0 -0
- data/examples/io/{echo_client.rb → xx-echo_client.rb} +0 -1
- data/examples/io/{echo_client_from_stdin.rb → xx-echo_client_from_stdin.rb} +0 -1
- data/examples/io/{echo_pipe.rb → xx-echo_pipe.rb} +0 -0
- data/examples/io/{echo_server.rb → xx-echo_server.rb} +0 -0
- data/examples/io/{echo_server_with_timeout.rb → xx-echo_server_with_timeout.rb} +0 -0
- data/examples/io/{echo_stdin.rb → xx-echo_stdin.rb} +0 -0
- data/examples/io/xx-httparty.rb +13 -0
- data/examples/io/{irb.rb → xx-irb.rb} +0 -0
- data/examples/io/{net-http.rb → xx-net-http.rb} +0 -0
- data/examples/io/{open.rb → xx-open.rb} +0 -1
- data/examples/io/{system.rb → xx-system.rb} +0 -0
- data/examples/io/{tcpserver.rb → xx-tcpserver.rb} +0 -0
- data/examples/io/{tcpsocket.rb → xx-tcpsocket.rb} +0 -1
- data/examples/{fs/read.rb → performance/fs_read.rb} +0 -0
- data/examples/{core → performance}/mem-usage.rb +1 -0
- data/examples/performance/multi_snooze.rb +2 -0
- data/examples/performance/snooze.rb +2 -0
- data/examples/performance/thread-vs-fiber/polyphony_server.rb +5 -3
- data/examples/performance/thread-vs-fiber/threaded_server.rb +1 -1
- data/examples/{io/httparty_multi.rb → performance/thread-vs-fiber/xx-httparty_multi.rb} +16 -13
- data/examples/{io/httparty_threaded.rb → performance/thread-vs-fiber/xx-httparty_threaded.rb} +2 -2
- data/examples/performance/thread.rb +27 -0
- data/examples/{core → performance}/thread_pool_perf.rb +0 -0
- data/ext/gyro/extconf.rb +1 -0
- data/lib/polyphony/extensions/core.rb +0 -5
- data/lib/polyphony/version.rb +1 -1
- data/polyphony.gemspec +3 -9
- metadata +59 -167
- data/bin/poly +0 -11
- data/examples/core/cancel.rb +0 -13
- data/examples/core/enumerator.rb +0 -15
- data/examples/core/error_bubbling.rb +0 -35
- data/examples/core/fiber_error.rb +0 -9
- data/examples/core/fiber_error_with_backtrace.rb +0 -73
- data/examples/core/move_on.rb +0 -11
- data/examples/core/move_on_twice.rb +0 -16
- data/examples/core/move_on_with_ensure.rb +0 -13
- data/examples/core/move_on_with_value.rb +0 -14
- data/examples/core/multiple_spin.rb +0 -18
- data/examples/core/nested_cancel.rb +0 -40
- data/examples/core/nested_multiple_spin.rb +0 -20
- data/examples/core/nested_spin.rb +0 -19
- data/examples/core/pingpong.rb +0 -21
- data/examples/core/resource.rb +0 -30
- data/examples/core/sleep_spin.rb +0 -21
- data/examples/core/snooze.rb +0 -32
- data/examples/core/spin_error.rb +0 -17
- data/examples/core/spin_uncaught_error.rb +0 -16
- data/examples/core/supervisor_with_cancel_scope.rb +0 -23
- data/examples/core/supervisor_with_error.rb +0 -24
- data/examples/core/supervisor_with_manual_move_on.rb +0 -23
- data/examples/core/suspend.rb +0 -13
- data/examples/core/thread.rb +0 -27
- data/examples/http/config.ru +0 -7
- data/examples/http/cuba.ru +0 -22
- data/examples/http/happy_eyeballs.rb +0 -37
- data/examples/http/http2_raw.rb +0 -135
- data/examples/http/http_client.rb +0 -28
- data/examples/http/http_get.rb +0 -33
- data/examples/http/http_parse_experiment.rb +0 -123
- data/examples/http/http_proxy.rb +0 -83
- data/examples/http/http_server.js +0 -24
- data/examples/http/http_server.rb +0 -28
- data/examples/http/http_server_forked.rb +0 -29
- data/examples/http/http_server_graceful.rb +0 -27
- data/examples/http/http_server_simple.rb +0 -11
- data/examples/http/http_server_throttled.rb +0 -15
- data/examples/http/http_ws_server.rb +0 -37
- data/examples/http/https_raw_client.rb +0 -12
- data/examples/http/https_server.rb +0 -22
- data/examples/http/https_wss_server.rb +0 -39
- data/examples/http/rack_server.rb +0 -12
- data/examples/http/rack_server_https.rb +0 -19
- data/examples/http/rack_server_https_forked.rb +0 -27
- data/examples/http/websocket_secure_server.rb +0 -27
- data/examples/http/websocket_server.rb +0 -24
- data/examples/http/ws_page.html +0 -34
- data/examples/http/wss_page.html +0 -34
- data/examples/io/cat.rb +0 -12
- data/examples/io/httparty.rb +0 -10
- data/examples/io/io_read.rb +0 -9
- data/lib/ev_ext.bundle +0 -0
- data/lib/polyphony/http.rb +0 -16
- data/lib/polyphony/http/client/agent.rb +0 -131
- data/lib/polyphony/http/client/http1.rb +0 -129
- data/lib/polyphony/http/client/http2.rb +0 -180
- data/lib/polyphony/http/client/response.rb +0 -32
- data/lib/polyphony/http/client/site_connection_manager.rb +0 -109
- data/lib/polyphony/http/server.rb +0 -49
- data/lib/polyphony/http/server/http1.rb +0 -268
- data/lib/polyphony/http/server/http2.rb +0 -78
- data/lib/polyphony/http/server/http2_stream.rb +0 -136
- data/lib/polyphony/http/server/rack.rb +0 -64
- data/lib/polyphony/http/server/request.rb +0 -118
- data/lib/polyphony/websocket.rb +0 -59
- data/test/test_http_server.rb +0 -313
data/bin/poly
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require_relative('../lib/polyphony/http')
|
4
|
-
|
5
|
-
app_path = ARGV.first || './config.ru'
|
6
|
-
app = Polyphony::HTTP::Rack.load(app_path)
|
7
|
-
opts = { reuse_addr: true, dont_linger: true }
|
8
|
-
|
9
|
-
puts "listening on port 1234"
|
10
|
-
puts "pid: #{Process.pid}"
|
11
|
-
Polyphony::HTTP::Server.serve('0.0.0.0', 1234, opts, &app)
|
data/examples/core/cancel.rb
DELETED
data/examples/core/enumerator.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'polyphony'
|
5
|
-
|
6
|
-
::Exception.__disable_sanitized_backtrace__ = true
|
7
|
-
|
8
|
-
def test
|
9
|
-
# error is propagated to calling coprocess
|
10
|
-
raised_error = nil
|
11
|
-
spin do
|
12
|
-
spin do
|
13
|
-
raise 'foo'
|
14
|
-
end
|
15
|
-
puts "before snooze"
|
16
|
-
snooze # allow nested coprocess to run before finishing
|
17
|
-
puts "after snooze"
|
18
|
-
end
|
19
|
-
suspend
|
20
|
-
rescue Exception => e
|
21
|
-
raised_error = e
|
22
|
-
ensure
|
23
|
-
puts "raised_error: #{raised_error.inspect}"
|
24
|
-
# puts "msg: #{raised_error.message.inspect}"
|
25
|
-
end
|
26
|
-
|
27
|
-
test
|
28
|
-
begin
|
29
|
-
puts "last suspend"
|
30
|
-
#suspend
|
31
|
-
Gyro.run
|
32
|
-
rescue => e
|
33
|
-
puts "!" * 60
|
34
|
-
puts "Error after last suspend: #{e.inspect}"
|
35
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'fiber'
|
4
|
-
|
5
|
-
# This is an experiment to see if we could provide better backtraces for
|
6
|
-
# exceptions raised in fibers. Our approach is to monkey-patch Fiber.new so as
|
7
|
-
# to keep track of the caller stack trace and calling fiber. We also
|
8
|
-
# monkey-patch Exception#backtrace to calculate the full backtrace based on the
|
9
|
-
# fiber in which the exception was raised. The benefit of this approach is that
|
10
|
-
# there's no need to sanitize the backtrace (remove stack frames related to the
|
11
|
-
# backtrace calculation).
|
12
|
-
class Fiber
|
13
|
-
attr_writer :__calling_fiber__, :__caller__
|
14
|
-
|
15
|
-
class << self
|
16
|
-
alias_method :orig_new, :new
|
17
|
-
def new(&block)
|
18
|
-
calling_fiber = Fiber.current
|
19
|
-
fiber_caller = caller
|
20
|
-
orig_new(&block).tap do |f|
|
21
|
-
f.__calling_fiber__ = calling_fiber
|
22
|
-
f.__caller__ = fiber_caller
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def caller
|
28
|
-
@__caller__ ||= []
|
29
|
-
if @__calling_fiber__
|
30
|
-
@__caller__ + @__calling_fiber__.caller
|
31
|
-
else
|
32
|
-
@__caller__
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
class Exception
|
38
|
-
alias_method :orig_initialize, :initialize
|
39
|
-
|
40
|
-
def initialize(*args)
|
41
|
-
@__raising_fiber__ = Fiber.current
|
42
|
-
orig_initialize(*args)
|
43
|
-
end
|
44
|
-
|
45
|
-
alias_method :orig_backtrace, :backtrace
|
46
|
-
def backtrace
|
47
|
-
unless @backtrace_called
|
48
|
-
@backtrace_called = true
|
49
|
-
return orig_backtrace
|
50
|
-
end
|
51
|
-
|
52
|
-
if @__raising_fiber__
|
53
|
-
backtrace = orig_backtrace || []
|
54
|
-
backtrace + @__raising_fiber__.caller
|
55
|
-
else
|
56
|
-
orig_backtrace
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def foo
|
62
|
-
Fiber.new do
|
63
|
-
bar
|
64
|
-
end.resume
|
65
|
-
end
|
66
|
-
|
67
|
-
def bar
|
68
|
-
Fiber.new do
|
69
|
-
raise 'baz'
|
70
|
-
end.resume
|
71
|
-
end
|
72
|
-
|
73
|
-
foo
|
data/examples/core/move_on.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'polyphony'
|
5
|
-
|
6
|
-
puts 'going to sleep...'
|
7
|
-
move_on_after(1) do
|
8
|
-
sleep 60
|
9
|
-
end
|
10
|
-
puts 'woke up'
|
11
|
-
|
12
|
-
puts 'going to sleep...'
|
13
|
-
move_on_after(1) do
|
14
|
-
sleep 60
|
15
|
-
end
|
16
|
-
puts 'woke up'
|
@@ -1,14 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'polyphony'
|
5
|
-
Exception.__disable_sanitized_backtrace__ = true
|
6
|
-
|
7
|
-
def blocking_operation
|
8
|
-
sleep 60
|
9
|
-
:foo
|
10
|
-
end
|
11
|
-
|
12
|
-
puts 'going to sleep...'
|
13
|
-
value = move_on_after(1, with_value: :bar) { blocking_operation }
|
14
|
-
puts "got value #{value.inspect}"
|
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'polyphony'
|
5
|
-
|
6
|
-
def sleep_and_cancel
|
7
|
-
puts "#{Time.now} going to sleep with cancel..."
|
8
|
-
cancel_after(1) do
|
9
|
-
puts "#{Time.now} outer cancel scope"
|
10
|
-
cancel_after(10) do
|
11
|
-
puts "#{Time.now} inner cancel scope"
|
12
|
-
sleep 60
|
13
|
-
rescue Exception => e
|
14
|
-
puts "#{Time.now} inner scope got error: #{e}"
|
15
|
-
raise e
|
16
|
-
end
|
17
|
-
rescue Exception => e
|
18
|
-
puts "#{Time.now} outer scope got error: #{e}"
|
19
|
-
end
|
20
|
-
ensure
|
21
|
-
puts "#{Time.now} woke up"
|
22
|
-
end
|
23
|
-
|
24
|
-
def sleep_and_move_on
|
25
|
-
puts "#{Time.now} going to sleep with move_on..."
|
26
|
-
move_on_after(1) do
|
27
|
-
puts "#{Time.now} outer cancel scope"
|
28
|
-
move_on_after(10) do
|
29
|
-
puts "#{Time.now} inner cancel scope"
|
30
|
-
sleep 60
|
31
|
-
puts "#{Time.now} inner scope done"
|
32
|
-
end
|
33
|
-
puts "#{Time.now} outer scope done"
|
34
|
-
end
|
35
|
-
puts "#{Time.now} woke up"
|
36
|
-
end
|
37
|
-
|
38
|
-
sleep_and_cancel
|
39
|
-
puts
|
40
|
-
sleep_and_move_on
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'polyphony'
|
5
|
-
|
6
|
-
spin do
|
7
|
-
puts 'going to sleep'
|
8
|
-
result = spin do
|
9
|
-
spin do
|
10
|
-
spin do
|
11
|
-
puts "Coprocess count: #{Polyphony::Coprocess.list.size}"
|
12
|
-
sleep(1)
|
13
|
-
end.await
|
14
|
-
end.await
|
15
|
-
end.await
|
16
|
-
puts "result: #{result}"
|
17
|
-
end
|
18
|
-
|
19
|
-
suspend
|
data/examples/core/pingpong.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'fiber'
|
4
|
-
|
5
|
-
ping = Fiber.new do |peer|
|
6
|
-
loop do
|
7
|
-
puts 'ping'
|
8
|
-
sleep 0.3
|
9
|
-
peer.transfer Fiber.current
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
pong = Fiber.new do |peer|
|
14
|
-
loop do
|
15
|
-
puts 'pong'
|
16
|
-
sleep 0.3
|
17
|
-
peer.transfer Fiber.current
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
ping.resume(pong)
|
data/examples/core/resource.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'polyphony'
|
5
|
-
|
6
|
-
resource_count = 0
|
7
|
-
Pool = Polyphony::ResourcePool.new(limit: 3) do
|
8
|
-
:"resource#{resource_count += 1}"
|
9
|
-
end
|
10
|
-
|
11
|
-
def user(number)
|
12
|
-
loop do
|
13
|
-
# puts "user #{number} >"
|
14
|
-
Pool.acquire do |r|
|
15
|
-
puts "user #{number} #{r.inspect} >"
|
16
|
-
sleep(0.05 + rand * 0.2)
|
17
|
-
puts "user #{number} #{r.inspect} <"
|
18
|
-
# raise if rand > 0.9
|
19
|
-
# STDOUT << '.'
|
20
|
-
# puts "#{number}: #{r.inspect}"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
3.times do |x|
|
26
|
-
spin { user(x) }
|
27
|
-
end
|
28
|
-
|
29
|
-
t0 = Time.now
|
30
|
-
every(10) { puts "uptime: #{Time.now - t0}" }
|
data/examples/core/sleep_spin.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'polyphony'
|
5
|
-
|
6
|
-
spin do
|
7
|
-
10.times do |i|
|
8
|
-
sleep 0.05
|
9
|
-
p i
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
spin do
|
14
|
-
puts 'going to sleep...'
|
15
|
-
sleep 0.4
|
16
|
-
puts 'woke up'
|
17
|
-
end.await
|
18
|
-
|
19
|
-
puts 'done'
|
20
|
-
|
21
|
-
suspend
|
data/examples/core/snooze.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'polyphony'
|
5
|
-
|
6
|
-
COUNT = 10_000
|
7
|
-
|
8
|
-
class ::Fiber
|
9
|
-
attr_accessor :tag
|
10
|
-
end
|
11
|
-
|
12
|
-
COUNTS = Hash.new { |h, k| h[k] = 0 }
|
13
|
-
|
14
|
-
def t(tag)
|
15
|
-
Fiber.current.tag = tag.to_s
|
16
|
-
COUNT.times do
|
17
|
-
COUNTS[tag] += 1
|
18
|
-
snooze
|
19
|
-
end
|
20
|
-
puts "#{tag} done"
|
21
|
-
rescue StandardError => e
|
22
|
-
puts e
|
23
|
-
end
|
24
|
-
|
25
|
-
GC.disable
|
26
|
-
cp1 = spin { t(:a) }
|
27
|
-
cp2 = spin { t(:b) }
|
28
|
-
|
29
|
-
sleep 0.01 while cp1.alive? || cp2.alive?
|
30
|
-
|
31
|
-
puts 'counts:'
|
32
|
-
p COUNTS
|
data/examples/core/spin_error.rb
DELETED