Last active

Embed URL


SSH clone URL

You can clone with HTTPS or SSH.

Download Gist

Unicorn.rb for configuration

View unicorn.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
worker_processes 3 # amount of unicorn workers to spin up
timeout 30 # restarts workers that hang for 30 seconds
preload_app true
GC.respond_to?(:copy_on_write_friendly=) and
GC.copy_on_write_friendly = true
before_fork do |server,worker|
defined?(ActiveRecord::Base) and
after_fork do |server,worker|
defined?(ActiveRecord::Base) and
if defined?(EventMachine)
unless EventMachine.reactor_running? && EventMachine.reactor_thread.alive?
if EventMachine.reactor_running?
end { }
Signal.trap("INT") { EventMachine.stop }
Signal.trap("TERM") { EventMachine.stop }
arches commented

I'm using this on Heroku and occasionally seeing this error: An EventMachine loop must be running to use publish_async calls.

Have you seen anything like this? I assume that for some reason the EventMachine crashed but the dyno remained alive. Do you have any suggestions for how to handle that case? Could I restart the EventMachine from inside one of my unicorn forks?

elihuu commented

I have also seen the same error. Did you find a solution? Also, do you see this: Error R12 (Exit timeout) -> At least one process failed to exit within 10 seconds of SIGTERM

This only started happening after I added this code.

The issues commented above were solved ? If yes, how ? Thanks in advance.

To @arches - it is possible that EM can crash while the dyno still is up (even when EM is restarted after forks). A quick way to avoid this is to ensure the loop is running before each call:

def ensure_em
  unless EventMachine.reactor_running? && EventMachine.reactor_thread.alive? { }
    sleep 1

# put this before calls

To @elihuu - hard to say what that might be. It could be a stray event loop, but stop should be getting called. If something is going wrong in the event loop, you might be able to find it by registering a global error handler.

EventMachine.error_handler{ |e|
  puts "Error raised during event loop: #{e.message}"

samnang commented

Above configuration works great for Unicorn + EventMachine, but every time either new deploy or restart heroku process, it prints out a lot of errors in the log

Same issue with Heroku here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.