ruby-pinyin icon indicating copy to clipboard operation
ruby-pinyin copied to clipboard

Punctuation#punctuations: prevent race-condition

Open layerssss opened this issue 4 years ago • 0 comments

您好,我在生产服务器上发现偶尔会出现错误:

RegexpError: empty char-class: /([]+)$/ (Most recent call first)
File /rails/vendor/bundle/ruby/3.0.0/gems/ruby-pinyin-0.5.0/lib/ruby-pinyin/punctuation.rb line 10 in initialize
File /rails/vendor/bundle/ruby/3.0.0/gems/ruby-pinyin-0.5.0/lib/ruby-pinyin/punctuation.rb line 10 in new
File /rails/vendor/bundle/ruby/3.0.0/gems/ruby-pinyin-0.5.0/lib/ruby-pinyin/punctuation.rb line 10 in regexp
File /rails/vendor/bundle/ruby/3.0.0/gems/ruby-pinyin-0.5.0/lib/ruby-pinyin/backend/mmseg.rb line 99 in block in apply
File /rails/vendor/bundle/ruby/3.0.0/gems/ruby-pinyin-0.5.0/lib/ruby-pinyin/backend/mmseg.rb line 96 in each
File /rails/vendor/bundle/ruby/3.0.0/gems/ruby-pinyin-0.5.0/lib/ruby-pinyin/backend/mmseg.rb line 96 in each_with_index
File /rails/vendor/bundle/ruby/3.0.0/gems/ruby-pinyin-0.5.0/lib/ruby-pinyin/backend/mmseg.rb line 96 in apply
File /rails/vendor/bundle/ruby/3.0.0/gems/ruby-pinyin-0.5.0/lib/ruby-pinyin/backend/mmseg.rb line 30 in romanize
File /rails/vendor/bundle/ruby/3.0.0/gems/ruby-pinyin-0.5.0/lib/ruby-pinyin.rb line 12 in romanize

发现在多线程环境里(sidekiq / puma),第一次加载 @punctuations 变量时会有 race-condition,一个简单的重现该错误的代码:

require 'bundler/setup'
require 'ruby-pinyin'

loop do
  1000.times.map do
    Thread.new do
      puts PinYin.of_string('甲乙丙丁').join(',')
    end
  end.each(&:join)
end

layerssss avatar Aug 21 '21 03:08 layerssss