提高并行能力

dev_tj
daiao 6 years ago
parent b857a71af9
commit 5a3345be47

@ -109,3 +109,5 @@ gem 'request_store'
# 敏感词汇 # 敏感词汇
gem 'harmonious_dictionary', '~> 0.0.1' gem 'harmonious_dictionary', '~> 0.0.1'
gem 'parallel', '~> 1.19', '>= 1.19.1'

@ -21,17 +21,19 @@ class Subjects::CourseUsedInfoService < ApplicationService
# choice_shixun_num: 选用该课程实训的个数(去重) # choice_shixun_num: 选用该课程实训的个数(去重)
# choice_shixun_frequency: 选用该课程实训的次数 # choice_shixun_frequency: 选用该课程实训的次数
course_info = [] course_info = []
schools.map do |school| schools.find_in_batches do |s|
name = school.name Parallel.each(s) do |school|
course_count = school.course_count name = school.name
student_count = school.courses.joins(:course_members).where(course_members: {role: 4, course_id: course_ids}).size course_count = school.course_count
shixun_ids = school.courses.joins(homework_commons: :homework_commons_shixun) student_count = school.courses.joins(:course_members).where(course_members: {role: 4, course_id: course_ids}).size
.where(homework_commons: {id: homework_common_ids}) shixun_ids = school.courses.joins(homework_commons: :homework_commons_shixun)
.pluck("homework_commons_shixuns.shixun_id") .where(homework_commons: {id: homework_common_ids})
choice_shixun_frequency = shixun_ids.size .pluck("homework_commons_shixuns.shixun_id")
choice_shixun_num = shixun_ids.uniq.size choice_shixun_frequency = shixun_ids.size
course_info << {school_id: school.id, school_name: name, course_count: course_count, student_count: student_count, choice_shixun_num = shixun_ids.uniq.size
choice_shixun_num: choice_shixun_num, choice_shixun_frequency: choice_shixun_frequency} course_info << {school_id: school.id, school_name: name, course_count: course_count, student_count: student_count,
choice_shixun_num: choice_shixun_num, choice_shixun_frequency: choice_shixun_frequency}
end
end end
course_info course_info
end end

@ -1,6 +1,8 @@
class Subjects::UserUsedInfoService < ApplicationService class Subjects::UserUsedInfoService < ApplicationService
require 'parallel'
attr_reader :subject, :shixun_ids attr_reader :subject, :shixun_ids
def initialize(subject) def initialize(subject)
@subject = subject @subject = subject
@shixun_ids = subject.shixuns.pluck(:id) @shixun_ids = subject.shixuns.pluck(:id)
@ -10,18 +12,21 @@ class Subjects::UserUsedInfoService < ApplicationService
def call def call
users_info = [] users_info = []
users = User.includes(myshixuns: :games).where(myshixuns: {shixun_id: shixun_ids}, games: {status: 2}, users: {is_test: false}) users = User.includes(myshixuns: :games).where(myshixuns: {shixun_id: shixun_ids}, games: {status: 2}, users: {is_test: false})
users.find_each do |user| users.find_in_batches do |u|
myshixuns = user.myshixuns.select{|m| shixun_ids.include?(m.shixun_id)} Parallel.each(u, in_processes: 5) do |user|
name = "#{user.lastname}#{user.firstname}" myshixuns = user.myshixuns.select{|m| shixun_ids.include?(m.shixun_id)}
passed_myshixun_count = myshixuns.select{|m| m.status == 1}.size name = "#{user.lastname}#{user.firstname}"
passed_games_count = myshixuns.map{|m| m.games.select{|g| g.status == 2}.size }.size passed_myshixun_count = myshixuns.select{|m| m.status == 1}.size
code_line_count = 0 passed_games_count = myshixuns.map{|m| m.games.select{|g| g.status == 2}.size }.size
evaluate_count = myshixuns.map{|m| m.output_times }.sum code_line_count = 0
cost_time = myshixuns.map{|m|m.total_cost_time }.sum evaluate_count = myshixuns.map{|m| m.output_times }.sum
users_info << {user_id: user.id, name: name, passed_myshixun_count: passed_myshixun_count, cost_time = myshixuns.map{|m|m.total_cost_time }.sum
passed_games_count: passed_games_count, code_line_count: code_line_count, users_info << {user_id: user.id, name: name, passed_myshixun_count: passed_myshixun_count,
evaluate_count: evaluate_count, cost_time: cost_time} passed_games_count: passed_games_count, code_line_count: code_line_count,
evaluate_count: evaluate_count, cost_time: cost_time}
end
end end
users_info users_info
end end

@ -51,7 +51,7 @@ namespace :subjects do
puts("---------------------course_info_statistic: #{subject.id}") puts("---------------------course_info_statistic: #{subject.id}")
Rails.logger.info("---------------------course_info_statistic: #{subject.id}") Rails.logger.info("---------------------course_info_statistic: #{subject.id}")
data = Subjects::CourseUsedInfoService.call(subject) data = Subjects::CourseUsedInfoService.call(subject)
data.each do |key| Parallel.map(data) do |key|
next if key[:school_id].nil? next if key[:school_id].nil?
str += ", " unless str.empty? str += ", " unless str.empty?
str += ("(#{subject.id}, #{key[:school_id]}, '#{key[:school_name]}', #{key[:course_count]}, " + str += ("(#{subject.id}, #{key[:school_id]}, '#{key[:school_name]}', #{key[:course_count]}, " +
@ -125,7 +125,7 @@ namespace :subjects do
subjects.find_each(batch_size: 50) do |subject| subjects.find_each(batch_size: 50) do |subject|
puts("---------------------user_info_statistic: #{subject.id}") puts("---------------------user_info_statistic: #{subject.id}")
data = Subjects::UserUsedInfoService.call(subject) data = Subjects::UserUsedInfoService.call(subject)
data.each do |key| Parallel.each(data) do |key|
next if key[:user_id].nil? next if key[:user_id].nil?
str += ", " unless str.empty? str += ", " unless str.empty?
str += ("(#{key[:user_id]}, #{subject.id}, '#{key[:name].gsub(/'/, '"')}', #{key[:passed_myshixun_count]}, " + str += ("(#{key[:user_id]}, #{subject.id}, '#{key[:name].gsub(/'/, '"')}', #{key[:passed_myshixun_count]}, " +

Loading…
Cancel
Save