前提・実現したいこと
Ruby on Railsにて、 Twitter api を用い、任意のユーザーの一週間分のツイートを取得する処理を書いています。
実現したい処理自体は実装出来たのですが、レスポンススピードが遅く、待ち時間が多く発生します。そこで、ツイートを一軒づつ取得する処理を並列化できないかと考えました。
そこでご質問なのですが、下記コードの処理を並列化する事は可能でしょうか?
または、この処理を高速化する手段はございますでしょうか?
該当のソースコード
Ruby
1#任意のユーザのツイートを一週間分取得する処理 2#not_within_a_week?(tweet) 今日〜一週間以内のツイートであるか否か判定する関数 3#create_client 認証情報を渡す関数 4#tweet_update データベースにデータがあれば、情報の更新 5#tweet_add_db なければ新規登録 6 7client = create_client 8user_id = '任意のユーザーID' 9is_break = false 10max_id = client.user_timeline( user_id )[0].id #最新のツイートのid.このidから遡っていく. 11 1216.times{#3200件以上のツイートを遡れない為、16回ループ(200*16=3200) 13 #*********↓この処理を並列化したい↓*********# 14 #最新のツイートのidから200件遡り取得.最後に処理したツイートのidから、再度200件取得.この処理を、ツイートが一週間以内のものに限り、16回繰り返す. 15 client.user_timeline(user_id, count:200, max_id:max_id, include_rts: false, exclude_replies: false).each {|tweet| 16 is_break = true and break if not_within_a_week?(tweet) #一週間以内のものでなければbreak 17 if Tweet.find_by(tweet_id: tweet.id) 18 tweet_update_db user_id,tweet 19 else 20 tweet_add_db user_id,tweet 21 end 22 max_id = tweet.id 23 } 24 break if is_break #一週間以内のものでなければbreak 25 #*********↑ここまで↑*********# 26}
試したこと
配列の並列処理などと同じように出来るのではないかと考え、「Thread」や「Parallel」などのキーワードで調べて見ましたが、理解不足のため、うまく実装する事が出来ませんでした。
上記メソッドを使えば実現できるのではないか?と考えていたのですが、
client.user_timeline(user_id, count:200, max_id:max_id, include_rts: false, exclude_replies: false).each {|tweet|
の部分を、
Parallel.each(client.user_timeline(user_id, count:200, max_id:max_id, include_rts: false, exclude_replies: false), :in_threads=>2) {|tweet|
に書き換える等、試して見ましたが、ツイートの取得さえできませんでした。
補足情報(FW/ツールのバージョンなど)
rails 5.1.6
ruby 2.4.0
あなたの回答
tips
プレビュー