32
 require 'net/http'

urls = [
  {'link' => 'http://www.google.com/'},
  {'link' => 'http://www.facebook.com/'},
 {'link' => 'http://www.yahoo.com/'}
]

urls.each do |u|
  u['content'] = Net::HTTP.get( URI.parse(u['link']) )
end

print urls

これは手続き型コードとして機能します。サーバーにアクセスしたいだけで、順序については問題ありません。ルビーでそれを行うにはどうすればよいですか。1 つのオプションは、スレッドを使用することです。

スレッドを使用した例を次に示します。

require 'net/http'

urls = [
  {'link' => 'http://www.google.com/'},
  {'link' => 'http://www.facebook.com/'},
  {'link' => 'http://www.yahoo.com/'}
]

urls.each do |u|
  Thread.new do
    u['content'] = Net::HTTP.get( URI.parse(u['link']) )
    puts "Successfully requested #{u['link']}"

    if urls.all? {|u| u.has_key?("content") }
      puts "Fetched all urls!"
      exit
    end
  end
end

より良い解決策..??

PS:- mixpanel を押したいので、http 呼び出しを行い、応答を待ちたくないのです。

4

3 に答える 3

15

軽量の非同期処理は Threads (あなたが言ったように) またはFibersの仕事です。

それ以外の場合は、非常に強力なツールであるEventMachineを検討する必要があります。

編集: 上記の Event Machine の URL は無効です。これが彼らの GitHub アカウントhttps://github.com/eventmachine/eventmachineです。それは良い出発点として役立ちます。

于 2011-07-10T22:03:19.900 に答える
12

これは、トピックをカバーする素晴らしい記事です。

一般に、これにスレッドを使用する代わりに実行可能な方法は、ファイバーを使用するか、em-http-requestを使用することです。後者の例では、特定の目的のためにコールバック処理を省略できます。

于 2011-07-10T22:12:32.620 に答える