Ruby atexit와 Parallel에서 이상한 일이 생겼어요.

3941 단어 RubyRails

at_이른바 exit


루비Kernel#at_exit에는 이런 방법이 있다.
루비 처리가 끝났을 때 추가로 수행할 수 있는 처리로, 사용법에 따라 매우 편리하게 사용할 수 있다.
(자세한 조사는 없었지만 여러 젬에서 사용한 것 같다)

Parallel 소개


Ruby에서 다중 프로세스/스레드 처리를 간단하게 사용할 수 있는 Gem입니다.
Ruby 병렬 처리 시 자주 사용하려고 합니다.

이번에 발생한 문제

at_exit와 Parallel이 동시에 다중 프로세스 처리를 사용하면서 이상한 행동이 나타났다.
구체적으로 이런 느낌↓
test.rb
at_exit do
  puts "run at_exit!"
end

Parallel.each(1..4, in_processes: 4) do |num|
  sleep num
  puts "sleep done! #{num}"
end

이 파일을 실행한 결과↓
$ ruby at_exit_and_multi_process_test.rb
sleep done! 1
run at_exit!
sleep done! 2
run at_exit!
sleep done! 3
run at_exit!
sleep done! 4
run at_exit!
run at_exit!
at_exit 5번 뛰었어!!
기본적으로 at_exit를 사용할 때 마지막으로 한 번만 뛰면 안 된다고 생각해요.
나는 아마도 원인을 알아차릴 수 있을 것이라고 생각한다.at_exit 내의 처리는 루비의 처리가 끝날 때 걸려야 하는데 그'루비의 처리의 끝'은 각 서브 과정에서 발생했고 포크 부모 과정의 상태의 서브 과정에서도 마찬가지at_exit의 처리가 도망갔다고 한다.(가능)
그리고 아버지 프로세스의 끝부분을 포함해 다섯 차례나 뛰었다.
참고로 다선정 처리에서 문제없이 동작을 하였는데, 결과는 다음과 같다↓
$ ruby at_exit_and_multi_thread_test.rb
sleep done! 1
sleep done! 2
sleep done! 3
sleep done! 4
run at_exit!
아마 at_exit와 파라엘을 동시에 사용하는 사람이 없을 거예요. 그래서 투덜거려도 별로 인기가 없어서 이 글을 썼어요.
곰곰이 생각해보면 다 알겠지만 특별한 의식 없이 그러다 보니 행동이 이상해졌으니 주의하세요

참고 자료


https://docs.ruby-lang.org/ja/latest/method/Kernel/m/at_exit.html
https://techracho.bpsinc.jp/hachi8833/2018_05_22/56171
https://qiita.com/sekido-ts/items/5dc9c88d877bb2a1df0b
https://qiita.com/Kohei909Otsuka/items/26be74de803d195b37bd

좋은 웹페이지 즐겨찾기