2016-11-11 19 views
2

일부 데이터 분석을 처리 할 수있는 GCE 서버 설정이 있습니다. 나는 twisted을 사용하여 ws을 통해 그것과 통신 할 수있다. 나는이 서버의 유일한 클라이언트이다. 이 클라이언트의 연결을 처리하기 때문에신호 분석기에서 비틀어 진 반응기를 강제로 닫습니다.

내가 시스템을 정지하기 위해 노력하고있어 및 클라이언트가 연결되어
spawn_multiprocessing_hierarchy() 
reactor.run() # Blocks main thread 
stop_everything_and_cleanup() 

, reactor 무시 (혹은 무기한 연기?)합니다 SIGTERM :

시스템은 다음과 같이 설정입니다. 그러나 시스템의 다른 모든 부분은 내결함성이 있으며 reactor결코 중요한 데이터를 처리합니다. 이는 모니터링 목적으로 만 존재합니다. 이것은 내가 쉽게 SIGKILL이 될 수 있다는 것을 의미한다. 다른 실행을위한 것이 아니었다. multiprocess.Process 다음 발사에서 마지막으로 멈 췄던 곳에서 계속할 수 있도록 메모리에 데이터를 덤프해야한다.

SIGTERM을 즉시 (반응기에서 작업 실행을 기다리지 않고) 연결을 끊고 반응기를 중지 할 수 있습니까?

답변

0

코드의 나머지 부분을 보지 않아도 정확한 문제가 무엇인지 추측하기가 어렵습니다. 일반적으로 반응기가 멈추지 않으면 그것은 작업이 쓰레드 또는 프로세스에서 실행되기 때문입니다. Twisted는 "옳은 일"을하려고 할 것이고, 종료하기 전에 모든 쓰레드/프로세스가 끝날 때까지 기다릴 것입니다. 반응기가 reactor.addSystemEventTrigger을 통해 중지되면 이벤트를 추가 할 수 있습니다.

+0

작업이 진행 중이므로 내 원자로가 멈추지 않는다는 것을 알고 있습니다. 단 하나의 클라이언트 만 서버에 연결되었다는 것을 감안할 때, 나는 서버에서 동시에 실행될 필요가 있기 때문에 원자로가 매우 긴 작업을 수행하도록하는 것이 좋습니다. 원자로가 임무 수행에 중요한 역할을하지 않기 때문에 원자로가 떨어지게하고 싶습니다. 필요할 때 시스템 출구를 지연시키고 있습니다. – Mirac7

+0

이 문제를 해결하는 방법 중 하나는 Twisted (즉''reactor.spawnProcess'',''task.deferToThread'',''threads.callInThread'' 등)를 통해 프로세스를 생성하는 것이 아니라 프로세스 객체를 수동으로 관리하고' 'daemon = True''. 이렇게하면 Twisted는 스레드/프로세스를 신경 쓰지 않고 앱이 멈 추면 단순히 "죽습니다". –