tôi đoán là một trong hai điều gì đó trói vòng lặp EventMachine lò phản ứng ngăn không cho nó thoát, hoặc một cái gì đó của bẫy SIGINT.
Là một ví dụ đơn giản của cựu, đưa điều này vào config.ru
và chạy với thin -p 4567 start
:
require 'thin'
require 'sinatra'
require 'eventmachine'
get '/' do
"hello world"
end
run Sinatra::Application
EventMachine.schedule do
trap("INT") do
puts "Caught SIGINT"
EventMachine.stop # this is useless
# exit # this stops the EventMachine
end
i = 0
while i < 10
puts "EM Running"
i += 1
sleep 1
end
end
Nếu không có bẫy các SIGINT, bạn sẽ có hành vi tương tự như khi bẫy nó và gọi EM.stop. EM.stop (ít nhất là trong phiên bản ruby thuần túy, mà bạn có thể chạy với EVENTMACHINE_LIBRARY="pure_ruby" thin start
) đặt một cờ mà một yêu cầu dừng được yêu cầu, được chọn bên trong vòng lặp lò phản ứng. Nếu vòng lặp lò phản ứng bị kẹt trên một bước (như trong trường hợp trên), thì nó sẽ không thoát ra.
Vì vậy, một vài lựa chọn:
sử dụng workaround trên của bẫy SIGINT và buộc một lối ra. Điều này có thể rời khỏi các kết nối trong tình trạng ô uế, nhưng họ không gọi nó là nhanh & bẩn cho không có gì;)
bạn có thể đặt mã chặn bên trong một chủ đề hoặc một sợi, mà sẽ cho phép các lò phản ứng để giữ đang chạy.
tìm các tác vụ hoặc vòng lặp dài bên trong mã của bạn và chuyển đổi các tính năng này thành EventMachine. em-http-request là một thư viện tuyệt vời cho các yêu cầu http bên ngoài và đồng bộ hóa em có một số giao thức khác (cho các kết nối cơ sở dữ liệu, các nhóm kết nối tcp, v.v.). Trong ví dụ trên, đây là đơn giản: EventMachine.add_periodic_timer(1) { puts "EM Running" }
Trong mã thực tế của bạn, điều này có thể khó khăn hơn để theo dõi xuống, nhưng tìm kiếm bất kỳ nơi bạn sinh ra chủ đề và tham gia cùng họ, hoặc vòng lớn. Một công cụ lược tả có thể giúp hiển thị mã nào đang chạy khi bạn cố gắng thoát ra, và cuối cùng bạn có thể thử vô hiệu hóa các phần khác nhau của hệ thống và các thư viện để tìm ra thủ phạm.
Nguồn
2011-07-20 08:49:40
bạn có thể cung cấp các tệp cấu hình mỏng và nắp của mình không? – Anatoly
Thử 'ctrl + Z' và sau đó là' Enter'? – Zabba
Bạn cũng có thể thử Ctrl-\ ít được biết đến mà đôi khi làm việc kỳ diệu. –