如何在 ScheduledTask 的执行方法中调用块?
How can I call a block within the execute method of a ScheduledTask?
我试图在 Concurrent::ScheduledTask#execute
方法中调用一个块,但该块本身从未被执行。
我也试过用Concurrent::ScheduledTask#new
的方法,结果是一样的。我觉得这里可能有一个我遗漏的基本问题。任何帮助将不胜感激!
require 'concurrent'
##
# A basic Event
class Event
attr_accessor :ticks
# @param ticks [Numeric] The amount of ticks we wait before executing this event
def initialize(ticks = 1.0)
@ticks = ticks
puts "Event created with #{@ticks} ticks"
end
# Calls the block of this event for execution.
def execute(&block)
if !block_given?
raise AbstractEventExecution.new(self)
else
Concurrent::ScheduledTask.execute(@ticks *= 0.75) { block.call }
puts "Executed in #{@ticks} ticks"
end
end
end
class AbstractEventExecution < StandardError
attr_accessor :event
def initialize(event)
@event = event
super("The Event #{event} was not provided an execution block and is abstract.")
end
end
event1 = Event.new(105)
event2 = Event.new(1000)
event3 = Event.new(50)
event1.execute { puts "hai from event 1" }
event2.execute { puts "hai from event 2" }
event3.execute { puts "hai from event 3" }
输出结果如下:
Event created with 105 ticks
Event created with 1000 ticks
Event created with 50 ticks
executing an event...
Executed in 78.75 ticks
executing an event...
Executed in 750.0 ticks
executing an event...
Executed in 37.5 ticks
我不确定为什么 puts "hai from event x"
根本没有显示。此外,执行时没有延迟。应该分别有 78.75、750.0 和 37.5 秒的延迟,并且根本没有 none!
Concurrent::ScheduledTask#new
和Concurrent::ScheduledTask#execute
returns都一个[ScheduledTask]对象,然后主线程退出。
这就是 "hai from event x"
从未显示的原因。
require 'concurrent'
##
# A basic Event
class Event
attr_accessor :ticks
# @param ticks [Numeric] The amount of ticks we wait before executing this event
def initialize(ticks = 1.0)
@ticks = ticks
puts "Event created with #{@ticks} ticks"
end
# Calls the block of this event for execution.
def execute(&block)
if !block_given?
raise AbstractEventExecution.new(self)
else
task = Concurrent::ScheduledTask.execute(@ticks *= 0.75) { block.call }
puts "Executed in #{@ticks} ticks"
task
end
end
end
class AbstractEventExecution < StandardError
attr_accessor :event
def initialize(event)
@event = event
super("The Event #{event} was not provided an execution block and is abstract.")
end
end
event1 = Event.new(1)
event2 = Event.new(2)
event3 = Event.new(3)
t1 = event1.execute { puts "hai from event 1" }
t2 = event2.execute { puts "hai from event 2" }
t3 = event3.execute { puts "hai from event 3" }
# waiting for all threads to finish
[t1, t2, t3].map(&:wait)
我试图在 Concurrent::ScheduledTask#execute
方法中调用一个块,但该块本身从未被执行。
我也试过用Concurrent::ScheduledTask#new
的方法,结果是一样的。我觉得这里可能有一个我遗漏的基本问题。任何帮助将不胜感激!
require 'concurrent'
##
# A basic Event
class Event
attr_accessor :ticks
# @param ticks [Numeric] The amount of ticks we wait before executing this event
def initialize(ticks = 1.0)
@ticks = ticks
puts "Event created with #{@ticks} ticks"
end
# Calls the block of this event for execution.
def execute(&block)
if !block_given?
raise AbstractEventExecution.new(self)
else
Concurrent::ScheduledTask.execute(@ticks *= 0.75) { block.call }
puts "Executed in #{@ticks} ticks"
end
end
end
class AbstractEventExecution < StandardError
attr_accessor :event
def initialize(event)
@event = event
super("The Event #{event} was not provided an execution block and is abstract.")
end
end
event1 = Event.new(105)
event2 = Event.new(1000)
event3 = Event.new(50)
event1.execute { puts "hai from event 1" }
event2.execute { puts "hai from event 2" }
event3.execute { puts "hai from event 3" }
输出结果如下:
Event created with 105 ticks
Event created with 1000 ticks
Event created with 50 ticks
executing an event...
Executed in 78.75 ticks
executing an event...
Executed in 750.0 ticks
executing an event...
Executed in 37.5 ticks
我不确定为什么 puts "hai from event x"
根本没有显示。此外,执行时没有延迟。应该分别有 78.75、750.0 和 37.5 秒的延迟,并且根本没有 none!
Concurrent::ScheduledTask#new
和Concurrent::ScheduledTask#execute
returns都一个[ScheduledTask]对象,然后主线程退出。
这就是 "hai from event x"
从未显示的原因。
require 'concurrent'
##
# A basic Event
class Event
attr_accessor :ticks
# @param ticks [Numeric] The amount of ticks we wait before executing this event
def initialize(ticks = 1.0)
@ticks = ticks
puts "Event created with #{@ticks} ticks"
end
# Calls the block of this event for execution.
def execute(&block)
if !block_given?
raise AbstractEventExecution.new(self)
else
task = Concurrent::ScheduledTask.execute(@ticks *= 0.75) { block.call }
puts "Executed in #{@ticks} ticks"
task
end
end
end
class AbstractEventExecution < StandardError
attr_accessor :event
def initialize(event)
@event = event
super("The Event #{event} was not provided an execution block and is abstract.")
end
end
event1 = Event.new(1)
event2 = Event.new(2)
event3 = Event.new(3)
t1 = event1.execute { puts "hai from event 1" }
t2 = event2.execute { puts "hai from event 2" }
t3 = event3.execute { puts "hai from event 3" }
# waiting for all threads to finish
[t1, t2, t3].map(&:wait)