2010-04-19 36 views
0

我在Rails控制器执行以下操作:我应该期待Comet这么慢吗?

def poll 
    records = [] 
    start_time = Time.now.to_i 

    while records.length == 0 do 
    records = Something.uncached{Something.find(:all, 
     :conditions => { :some_condition => false})} 

    if records.length > 0 
     break 
    end 

    sleep 1 

    if Time.now.to_i - start_time >= 20 
     break 
    end 
    end 

    responseData = [] 

    records.each do |record| 
    responseData << { 
     'something' => record.some_value 
    } 

    # Flag message as received. 
    record.some_condition = true 
    record.save 
    end 

    render :text => responseData.to_json 
end 

,然后我已使用Javascript执行AJAX请求。请求在那里停留20秒,或直到控制器方法在数据库中找到一条记录,等待。这样可行。

function poll() { 
    $.ajax({ 
    url: '/my_controller/poll', 
    type: 'GET', 
    dataType: 'json', 
    cache: false, 
    data: 'time=' + new Date().getTime(), 
    success: function(response) { 
     // show response here 
    }, 
    complete: function() { 
     poll(); 
    }, 
    error: function() { 
     alert('error'); 
     poll(); 
    } 
    }); 
} 

当我在浏览器中打开5 - 10个选项卡时,我的web应用程序变得非常慢。

这是预期的吗?或者我可以做出一些明显的改进?

回答

2

嗯..这不是最好的方法。

根据您选择的服务器解决方案,您可能有1,2,.. x个可用服务器线程。 (例如,当您运行脚本/服务器时,您只能获得一个线程。) 当您“睡眠”时,服务器线程被阻止,无法服务于其他任何请求。由于线程数量有限,因此其他请求将等待运行请求完成。

您必须实现逻辑cient-side(在JS中)。您可以每秒钟将服务器池化10次,或直到找到记录。

一个jQuery库可能会诀窍是jQuery Timers

相关问题