1

これが私の最初の質問だと思います。できるだけ明確にしたいと思います。私は休閑コードを持っています。

def index_service_name
@currentService = Feed.where("name = '#{params[:name]}'").first

serviceId = @currentService['id']
serviceName = @currentService['name']
serviceFeedUrl = @currentService['feedUrl']

feed = Feedzirra::Feed.fetch_and_parse(serviceFeedUrl)

  feed.entries.reverse.each do |entry|
    case serviceName
      when 'service1', 'service2'
        uniqueId = entry.url.match(/\d+$/)[0]
        postContent = Nokogiri::HTML( entry.content ).css('img').map{ |i| i['src'] }.first # this would be an array.
      else
        uniqueId = entry.url
        postContent = entry.content
    end

    isIndexed = Post.where("post_unique_id = '#{uniqueId}' AND post_service = '#{serviceId}'")

    if postContent =~ %r{\Ahttps?://.+\.(?:jpe?g|png|gif)\z}i
      isImage = true
    elsif postContent =~ %r{http?s://(.*)/maxW500/}i
      isImage = true
    end

    if isIndexed.empty? && isImage
      sleep 1.seconds
      Post.create(post_service: serviceId, post_service_name: serviceName, title: entry.title, content: postContent, url: entry.url, post_unique_id: uniqueId)
    end
  end

通常のURL(/ something / service / service1、/ something / service / service2)を使用してサービスをトリガーします。それらを同時にトリガーすると、それらのすべてが他の1つが終了するのを待っているように見えます(したがって、私のDBでは、データは最初にservice1から保存され、その後service2から保存されます)。これはマルチスレッドと関係があると思いますが、RORはまだサポートしていないことを理解しています。

私はRORの初心者なので、優しくしてください。どんな助けでも大歓迎です。

4

1 に答える 1

0

MRI Ruby を使用していると仮定すると、並列マルチスレッドはありません。MRI には、並行して実行されない緑色のスレッドがあります。rubyのJRuby実装を使えば、並列マルチスレッドが使えるようになります。

どちらの方法でも、サーバーの 2 つのインスタンスを開始すると、そのコードを並行して実行できます。と を使用rails s -p 3000して、rails s -p 3001ポート 3001 と 3000 の 2 つのサーバーを起動します。次に、ポート 3000 で 1 つの URL にアクセスし、ポート 3001 で別の URL にアクセスしてみてください。そうすれば、コードが並列に実行されます。

于 2013-03-01T22:49:42.643 に答える