Асинхронное чтение файла в EventMachine

Я уже некоторое время играю с Ruby EventMachines и думаю, что понимаю его основы.

Однако я не уверен, как эффективно читать большой файл (120 МБ). Моя цель - прочитать файл построчно и записать каждую строку в базу данных Cassandra (то же самое должно быть с MySQL, PostgreSQL, MongoDB и т. Д., Потому что клиент Cassandra явно поддерживает EM). Простой фрагмент блокирует реактор, не так ли?

require 'rubygems'
require 'cassandra'
require 'thrift_client/event_machine'

EM.run do
  Fiber.new do
    rm = Cassandra.new('RankMetrics', "127.0.0.1:9160", :transport => Thrift::EventMachineTransport, :transport_wrapper => nil)
    rm.clear_keyspace!
    begin
      file = File.new("us_100000.txt", "r")
    while (line = file.gets)
      rm.insert(:Domains, "#{line.downcase}", {'domain' => "#{line}"})
    end
      file.close
    rescue => err
      puts "Exception: #{err}"
      err
    end
    EM.stop
  end.resume
end

Но как правильно заставить файл читать асинхронно?

6
задан halfer 22 January 2018 в 20:42
поделиться