2014-03-18 2 views
0

Я хочу выполнить sql-запрос как параллелизм. поэтому я использую eventmachine и mysql2/em на ruby ​​2.1.1 на linux.eventmachine и mysql2/em не callback

Но eventmachine не вызывает обратный вызов.

Когда мой сценарий запуска, это outputed

"loop start" 
"sql: select id from table where id = 1" 
"loop end" 
"loop start" 
"sql: select id from table where id = 2" 
"loop end" 
"loop start" 
"next loop" 
"loop start" 
"next loop" 
..... 

Я хочу, чтобы этот вывод.

"loop start" 
"sql: select id from table where id = 1" 
"loop end" 
"loop start" 
"sql: select id from table where id = 2" 
"loop end" 
"loop start" 
"next loop" 
"callback" 
"results" 
"loop start" 
"sql: select id from table where id = 3" 
..... 

Что не так?

#!/usr/bin/env ruby 

=begin 
Gemfile 

source 'https://rubygems.org' 
gem 'eventmachine' 
gem 'mysql2' 
gem 'pry' 
gem 'pry-debugger' 
=end 

require 'pp' 
require 'bundler' 
Bundler.require 
require 'mysql2/em' 

MYSQLINFO = { 
    host: 'localhost', 
    username: 'root', 
    password: '', 
    port: 3306, 
} 

SQLS = [ 
    'select id from table where id = 1', 
    'select id from table where id = 2', 
    'select id from table where id = 3', 
    'select id from table where id = 4', 
] 
CONCURRENCY = 2 

clients = [] 
CONCURRENCY.times do 
    clients << Mysql2::EM::Client.new(MYSQLINFO) 
end 

EM.run do 
    while true 
    pp 'loop start' 
    client = clients.shift 

    if client.nil? 
     # FIXME: I guess this point is wrong. Context must go to reactor thread? 
     # but I don't know how to do. 
     pp 'next loop' 
     next 
    end 

    sql = SQLS.shift 
    if sql.nil? 
     break 
    end 

    defer = client.query(sql) 

    pp "sql: #{sql}" 

    defer.callback do |results| 
     clients << client 
     pp 'callback' 
     pp results 
    end 
    pp 'loop end' 
    end 

    EM.stop 
end 

ответ

0

Как я уже говорил в офисе, может быть, вам не нужно заняться петлей здесь. Я думаю, что каждый клиент должен вызывать следующий запрос в своих обратных вызовах.

0
Y = lambda do |f| 
    lambda {|g| g[g]}[lambda do |g| 
    f[lambda {|*args| g[g][*args]}] 
    end] 
end 

EM.run do 
    sql = 'select oppai from boins' 

    clients.each do |client| 
    Y[lambda {|f| lambda {|client, sql| 
     client.query(sql).callback do |result| 
     pp result.to_a.inspect 
     f[client, sql] 
     end 
    }}][client, sql] 
    end 
end 
Смежные вопросы