socketry / async-container

Scalable multi-thread multi-process containers for Ruby.
MIT License
81 stars 4 forks source link

Container example doesn't actually initialize anything #15

Open tadman opened 4 years ago

tadman commented 4 years ago

The container example runs without doing anything:

controller = Async::Container::Controller.new do |container|
    Async.logger.debug(self, "Setting up container...")

    container.run(count: 1, restart: true) do
        Async.logger.debug(self, "Child process started.")

        while true
            sleep 1

            if rand < 0.1
                exit(1)
            end
        end
    ensure
        Async.logger.debug(self, "Child process exiting:", $!)
    end
end

begin
    controller.run
ensure
    Async.logger.debug(controller, "Parent process exiting:", $!)
end

Where the output is:

0.11s: Object
      | Starting up...
 0.11s: Async::Container::Notify::Console
      | {:status=>"Initializing..."}
 0.11s: Async::Container::Controller
      | Starting container...
 0.11s: Async::Container::Controller
      | Waiting for startup...
 0.11s: Async::Container::Forked
      | Waiting for ready:
 0.11s: Async::Container::Controller
      | Finished startup.
 0.11s: Async::Container::Notify::Console
      | {:ready=>true}
 0.11s: Async::Container::Controller
      | Parent process exiting:

There's no mention of a "Child process" in there because the block is ignored.

tadman commented 4 years ago

A reworked example that seems to function:

class ExampleController < Async::Container::Controller
  def setup(container)
    Async.logger.debug(self, "Container established.")

    container.run(count: 1, restart: true) do |instance|
      Async.logger.debug(self, "Child process started.")

      Async do |task|
        loop do
          task.sleep(1)
        end
      end

      instance.ready!

    ensure
      Async.logger.debug(self, "Child process exiting:", $!)
    end
  end
end

begin
  controller = ExampleController.new

  controller.run

ensure
  Async.logger.debug(controller, "Parent process exiting:", $!)
end

Where the setup method needs to be customized. Presumably new could capture that block and use it within setup?

ioquatix commented 4 years ago

I had it that way before but decided against it as a general pattern it's too magical and literally doesn't even really save more than a few lines of code.

ioquatix commented 3 months ago

Sorry, I don't understand my reply at all haha. I'm going to review this again.