2015-01-20 3 views
1

커널 # 트랩을 사용하여 신호를 잡으려고하고 해당 컨텍스트에서 데이터베이스 요청을 실행하려고하는데 위 오류가 나타납니다 . 그 누구도 전에 우연히 만났습니까? 그 주위에 어떤 방법이 있습니까?MongoDB Ruby 드라이버 - 'synchronize': 트랩 컨텍스트에서 호출 할 수 없습니다.

샘플 코드 :

trap('HUP') do 
    $db[:db_name].update({_id: 123}, {:$set => {a: 1}}) 
end 

loop { sleep 1 } 

이 오류를 줄 것이다 :

스크립트가 kill -HUP {pid}를 실행하여 전송할 수 HUP 신호를 수신
/usr/local/lib/ruby/gems/2.1.0/gems/mongo-1.11.1/lib/mongo/connection/pool.rb:266:in `synchronize': can't be called from trap context (ThreadError) 

. $ db는 MongoDB 객체 여야합니다.

+0

질문에 관련 코드를 삽입하면 사용자가 묻는 질문의 컨텍스트가 향상됩니다. 관련 코드로 질문을 수정하면 도움이됩니다. –

답변

2

Ruby는 트랩 컨텍스트 내에서 뮤텍스 동기화를 허용하지 않습니다. 아마도 교착 상태가 발생할 수 있습니다 (즉, 동기화 된 컨텍스트에있는 경우 프로세스에 신호를 보내고 다시 동기화하려고 시도 할 때 교착 상태가 발생합니다).). 아마 일을 대기해야 당신의 신호 처리기가 다른 스레드에 의해 처리 할이 문제를 해결하기 위해

# trap.rb 
require 'thread' 
mutex = Mutex.new 
trap('HUP') { mutex.synchronize {} } 
gets 

# pkill -HUP -f trap.rb 

trap.rb:3:in `synchronize': can't be called from trap context (ThreadError) 
     from trap.rb:3:in `block in <main>' 
     from trap.rb:4:in `call' 
     from trap.rb:4:in `gets' 
     from trap.rb:4:in `gets' 
     from trap.rb:4:in `<main>' 

아니면 그냥 새로운 스레드를 생성하고 거기에 작업을 수행 할 수 있습니다 : 당신은 하찮게를 통해이 문제를 재현 할 수

# trap.rb 
require 'thread' 
mutex = Mutex.new 
trap('HUP') do 
    Thread.new { mutex.synchronize { puts "hi!" } } 
end 
gets 

# pkill -HUP -f trap.rb 
hi! 
+0

위대한, 고마워 - 나는 그것을 줄 것이다. –

관련 문제