나는 간단히 .tac 파일을 실행하는 스크립트를 실행하여 systemd 서비스를 사용하여 실행되는 간단한 비틀어 진 응용 프로그램을 사용합니다.비틀림 및 시스템으로 캐시 워밍업 처리
응용 프로그램은 t.w.sr.ite에 내장되어 있고 t.a.i.TCPServer를 제공하고 t.a.Application에 모두 들어있는 t.w.r.Resource에 내장 된 JSON RPC 끝점 (fastjsonrpc)으로 구조화되어 있습니다. 이것은 잘 작동합니다.
내가 문제가되는 곳은 시작할 때 캐시를 워밍업하려고 할 때입니다. 이 워밍업 프로세스는 매우 느리고 (~ 300 초), systemd timeout을 만들어 프로세스를 종료합니다. 타임 아웃을 늘리는 것은 시스템 부팅을 막고 싶지 않기 때문에 실행 가능한 옵션이 아닙니다.
비슷한 코드는 Apache와 wsgi 내에서 Flask로 실행되는 별도의 스택에서 사용됩니다. 그 서버는 스스로를 시작하고 캐시를 만드는 데 시간이 걸리는 동안 systemd를 계속 진행시킵니다. 이 행동은 나에게 좋다.
나는하여 twrResource의 설정 함수 내에서 다음 사용하여 예열 기능 호출 시도했다 :
reactor.callLater(1, ep.warmup, None)
나는 아직 systemd 내에서 이것을 사용하여 시도 적이 없다, 그리고 twistd에서 테스트 한 직접 명령 행에. 서버가 예상대로 작동하지만 더 이상 SIGINT (^ C)에 응답하지 않습니다. callLater를 제거하면 서버가 SIGINT에 응답 할 수 있습니다.
예기치 않은 함수가 직접 호출되면 (callLater가 아니라 예 : 워밍업이 완료 될 때까지 기다리는 동안 systemd를 포기하는 배열이 아닌 경우) 결과 서버는 계속 SIGINT에 응답합니다.
- 장기 실행 웜업 코드를 처리하는 데 더 좋고/좋은 방법이 있습니까?
- 왜 twisted/reactor가 SIGINT에 응답하지 않습니까? 내가 여기서 뭔가를 놓치고 있니?
나는 300 초 동안 반응기를 막는 데 아무런 문제가 없지만, 그 후에 반응기가 정상적으로 반응해야한다. 원자로는 정상적으로 작동하지만 더 이상 SIGINT/SIGTERM에 응답하지 않으며 SIGKILL을 정지해야합니다. deferToThread는 제 캐시가 파이썬 객체의 꽤 복잡한 네트워크이므로 잘 작동하지 않습니다. –
또는 "예열 (warmup)"루틴을 다시 작성하여 지연된 값을 반환하여 주기적으로 원자로에 제어권을 양도 할 수 있습니다. 나는 이것이 당신이 보는 신호의 행동과 관련이 있을지 모르겠다. 그러나 그것을하는 더 좋은 방법이다. 한 가지 방법은 @inlineCallbacks를 사용하고 너무 많은 루프 반복 (루프 인 경우)을 "수행"하는 것입니다. – meejah