2 Stimmen

Was ist der Vorteil von EventMachine

Dies ist mein Testfall. Ich habe festgestellt, dass der EM nicht schneller ist als der allgemeine TCP-Server

den EM-Server:

    require 'rubygems'
    require 'benchmark'
    require 'eventmachine'
    class Handler  < EventMachine::Connection
      def receive_data(data)
            operation = proc do
                # simulate a long running request
                 a = []
                n = 5000
                for i in 1..n
                    a << rand(n)
                    a.sort!
                end
            end

        # Callback block to execute once the request is fulfilled
        callback = proc do |res|
            send_data "send_response\n"
        end

            puts data
            EM.defer(operation, callback)
      end
    end

    EventMachine::run {
      EventMachine.epoll
      EventMachine::start_server("0.0.0.0", 8080, Handler)
      puts "Listening..."
    }

und mein Benchmark-Test:

require 'rubygems'
require 'benchmark'
require 'socket'
Benchmark.bm do |x|
    x.report("times:") do
        for i in 1..20
            TCPSocket.open "127.0.0.1", 8080 do |s|
                    s.send "#{i}th sending\n", 0    
                if line = s.gets
                    puts line
                end
                puts "#{i}th sending"
            end
        end
    end
end

3voto

Tomasz Stanczak Punkte 12426

Einfachheit im Vergleich zu Fäden, nicht Geschwindigkeit. Hier finden Sie weitere Einblicke: EventMachine: Schnelles und skalierbares Event-Driven I/O Framework

Das Zitat, das auf Ihre Frage zutrifft:

Es ist viel darüber geschrieben worden, dass ereignisgesteuerte Programme theoretisch nicht schneller sind als solche mit Threads, und das stimmt auch. Aber in der Praxis denke ich, dass das ereignisgesteuerte Modell einfacher zu handhaben ist, wenn man eine extrem hohe Skalierbarkeit und Leistung erreichen und gleichzeitig ein Maximum an Robustheit gewährleisten will. Ich schreibe Programme, die monatelang oder jahrelang laufen müssen, ohne abzustürzen, Speicher zu verlieren oder irgendeine Art von Leistungsschwäche zu zeigen, daher funktioniert die ereignisgesteuerte Programmierung in der Praxis besser. Das Problem bei der ereignisgesteuerten Programmierung ist, dass man "rückwärts" schreiben muss. Ein threaded Modell speichert den Programmzustand (ineffizient) in lokalen Variablen auf einem Laufzeitstapel. In EM müssen Sie das selbst tun, was für Programmierer, die an Threads gewöhnt sind, sehr unintuitiv ist. Deshalb interessiere ich mich für Fibres, weil sie die Möglichkeit eröffnen, etwas zu schreiben, das für den Programmierer wie blockierende E/A aussieht, aber dennoch ereignisgesteuert ist und keine Threads verwendet.

1voto

seph Punkte 5948

Wir haben diese Übung erst gestern bei unserem Projekt durchgeführt. Es gibt viele konzeptionelle Hürden.

Werfen Sie einen Blick auf diese Demo-Rails-Anwendung von Ilya Grigorik. Er verwendet Apache Benchmark, um den Server gleichzeitig zu belasten, als ob Sie Verkehr von mehreren Besuchern auf Ihrer Website erhalten würden. Genau hier liegt der Vorteil von eventmachine. Anstatt alle Aufrufe an die Datenbank hintereinander zu schalten, werden sie asynchron gesendet, und die Ergebnisse sind dramatisch. Wenn Sie die Demo installieren, können Sie den Unterschied sehen, indem Sie den em_mysql2 adaptor(fast) durch den mysql2 adaptor(slow) in database.yml ersetzen

Auch wenn Sie eventmachine in einer Schleife verwenden, sind Sie durch die synchrone Natur der Schleife selbst eingeschränkt (langsam).

0voto

Ian Pointer Punkte 11

Eine Sache - Sie sollten EM.epoll aufrufen, bevor Sie in die Ereignisschleife mit EM.run eintreten, anstatt innerhalb der Schleife.

EventMachine.epoll
EventMachine::run {
  EventMachine::start_server("0.0.0.0", 8080, Handler)
  puts "Listening..."
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X