Class: Bootsnap::CLI::WorkerPool::Worker
- Inherits:
-
Object
- Object
- Bootsnap::CLI::WorkerPool::Worker
- Defined in:
- lib/bootsnap/cli/worker_pool.rb
Instance Attribute Summary collapse
-
#pid ⇒ Object
readonly
Returns the value of attribute pid.
-
#to_io ⇒ Object
readonly
Returns the value of attribute to_io.
Instance Method Summary collapse
- #close ⇒ Object
-
#initialize(jobs) ⇒ Worker
constructor
A new instance of Worker.
- #spawn ⇒ Object
- #work_loop ⇒ Object
- #write(message, block: true) ⇒ Object
Constructor Details
#initialize(jobs) ⇒ Worker
Returns a new instance of Worker.
110 111 112 113 114 115 116 117 118 |
# File 'lib/bootsnap/cli/worker_pool.rb', line 110 def initialize(jobs) @jobs = jobs @pipe_out, @to_io = IO.pipe(binmode: true) # Set the writer encoding to binary since IO.pipe only sets it for the reader. # https://github.com/rails/rails/issues/16514#issuecomment-52313290 @to_io.set_encoding(Encoding::BINARY) @pid = nil end |
Instance Attribute Details
#pid ⇒ Object (readonly)
Returns the value of attribute pid.
108 109 110 |
# File 'lib/bootsnap/cli/worker_pool.rb', line 108 def pid @pid end |
#to_io ⇒ Object (readonly)
Returns the value of attribute to_io.
108 109 110 |
# File 'lib/bootsnap/cli/worker_pool.rb', line 108 def to_io @to_io end |
Instance Method Details
#close ⇒ Object
130 131 132 |
# File 'lib/bootsnap/cli/worker_pool.rb', line 130 def close to_io.close end |
#spawn ⇒ Object
145 146 147 148 149 150 151 152 153 |
# File 'lib/bootsnap/cli/worker_pool.rb', line 145 def spawn @pid = Process.fork do to_io.close work_loop exit!(0) end @pipe_out.close true end |
#work_loop ⇒ Object
134 135 136 137 138 139 140 141 142 143 |
# File 'lib/bootsnap/cli/worker_pool.rb', line 134 def work_loop loop do job, *args = Marshal.load(@pipe_out) return if job == :exit @jobs.fetch(job).call(*args) end rescue IOError nil end |
#write(message, block: true) ⇒ Object
120 121 122 123 124 125 126 127 128 |
# File 'lib/bootsnap/cli/worker_pool.rb', line 120 def write(, block: true) payload = Marshal.dump() if block to_io.write(payload) true else to_io.write_nonblock(payload, exception: false) != :wait_writable end end |