Мне было интересно, могу ли я остановить выполнение операции, которая была дефферирована.Ruby Event Machine останавливает или убивает операцию дефиса
require 'rubygems'
require 'em-websocket'
EM.run do
EM::WebSocket.start(:host => '0.0.0.0', :port => 8080) do |ws|
ws.onmessage do |msg|
op = proc do
sleep 5 # Thread safe IO here that is safely killed
true
end
callback = proc do |result|
puts "Done!"
end
EM.defer(op, callback)
end
end
end
Это пример сервера веб-сокетов. Иногда, когда я получаю сообщение, я хочу сделать несколько ввода-вывода, позже может появиться другое сообщение, которое должно читать одно и то же, следующее всегда имеет приоритет над предыдущей. Поэтому я хочу отменить первый op и сделать второй.
Фактически, вы не используете только одну нить (кроме резьбы реактора) в любой точке? – Kashyap
Я _think_ Я получил ответ, который вы ищете (это работает, кстати). Но я не знаю, есть ли у него какие-либо нежелательные побочные эффекты:/Вот мое решение: https://gist.github.com/kgrz/6826255 – Kashyap
Вопрос не совсем ясен, почему я хочу это сделать. Да, в этом примере я бы использовал только один поток в любой заданной точке. Мой реальный пример мира состоит в том, что у меня есть два типа сообщений, которые входят. Тип 1 делает длинный IO, а тип 2 - множеством вещей. Когда приходит сообщение типа 1, он откладывает и занимает много времени, означает, что при приеме нескольких сообщений типа 2 выполняются их операционные и обратные вызовы. В основном я хочу, чтобы одна операция типа 1 продолжалась постоянно и не мешала никаким операциям типа 2. –