Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何在ScheduledTask的execute方法中调用块?_Ruby_Concurrency_Concurrent Ruby - Fatal编程技术网

Ruby 如何在ScheduledTask的execute方法中调用块?

Ruby 如何在ScheduledTask的execute方法中调用块?,ruby,concurrency,concurrent-ruby,Ruby,Concurrency,Concurrent Ruby,我试图在Concurrent::ScheduledTask#execute方法中调用一个块,但该块本身从未执行过 我还尝试使用Concurrent::ScheduledTask#new方法,但结果是一样的。我觉得这里可能有一个根本性的问题,我不知道。任何帮助都将不胜感激 要求“并发” ## #基本事件 班级活动 属性存取器:滴答声 #@param ticks[Numeric]执行此事件之前等待的刻度量 def初始化(刻度=1.0) @滴答声=滴答声 放置“使用#{@ticks}ticks创建的事

我试图在
Concurrent::ScheduledTask#execute
方法中调用一个块,但该块本身从未执行过

我还尝试使用
Concurrent::ScheduledTask#new
方法,但结果是一样的。我觉得这里可能有一个根本性的问题,我不知道。任何帮助都将不胜感激

要求“并发”
##
#基本事件
班级活动
属性存取器:滴答声
#@param ticks[Numeric]执行此事件之前等待的刻度量
def初始化(刻度=1.0)
@滴答声=滴答声
放置“使用#{@ticks}ticks创建的事件”
结束
#调用此事件的块以执行。
def执行(&block)
如果!给你块钱?
引发AbstractEventExecution.new(自我)
其他的
并发::ScheduledTask.execute(@ticks*=0.75){block.call}
将“在#{@ticks}ticks中执行”
结束
结束
结束
类AbstractEventExecution
结果如下:

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

我不知道为什么
会将“来自事件x的hai”
放在屏幕上,而不会显示出来。此外,执行时没有延迟。应该分别有78.75秒、750.0秒和37.5秒的延迟,根本没有延迟

这两个
Concurrent::ScheduledTask#new
Concurrent::ScheduledTask#execute
都返回一个[ScheduledTask]对象,然后主线程退出

这就是为什么从未显示“来自事件x的hai”

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)
要求“并发”
##
#基本事件
班级活动
属性存取器:滴答声
#@param ticks[Numeric]执行此事件之前等待的刻度量
def初始化(刻度=1.0)
@滴答声=滴答声
放置“使用#{@ticks}ticks创建的事件”
结束
#调用此事件的块以执行。
def执行(&block)
如果!给你块钱?
引发AbstractEventExecution.new(自我)
其他的
task=Concurrent::ScheduledTask.execute(@ticks*=0.75){block.call}
将“在#{@ticks}ticks中执行”
任务
结束
结束
结束
类AbstractEventExecution