Method: Async::Reactor#async

Defined in:
lib/async/reactor.rb

#async(*args) {|Task| ... } ⇒ Task

Start an asynchronous task within the specified reactor. The task will be executed until the first blocking call, at which point it will yield and and this method will return.

This is the main entry point for scheduling asynchronus tasks.

Yields:

  • (Task)

    Executed within the asynchronous task.

Returns:

  • (Task)

    The task that was



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/async/reactor.rb', line 89

def async(*args, &block)
  task = Task.new(self, &block)
  
  # I want to take a moment to explain the logic of this.
  # When calling an async block, we deterministically execute it until the
  # first blocking operation. We don't *have* to do this - we could schedule
  # it for later execution, but it's useful to:
  # - Fail at the point of call where possible.
  # - Execute determinstically where possible.
  # - Avoid overhead if no blocking operation is performed.
  task.run(*args)
  
  # Async.logger.debug "Initial execution of task #{fiber} complete (#{result} -> #{fiber.alive?})..."
  return task
end