2013-05-05 2 views
4

저는 파이썬의 apscheduler을 실행 중입니다. 정기적으로 토네이도의 AsyncHttpClient을 예약 된 작업으로 사용하는 일부 http 리소스에 대한 POST 작업을 일부 수행하려고합니다. 각 작업은 여러 POST를 수행합니다. 각 http 요청이 응답 할 때 콜백이 호출됩니다 (토니도가 이것을 수행하기 위해 future을 사용한다고 생각합니다).APScheduler와 함께 토네이도를 사용하는 방법?

Apscheduler은 다양한 스레드에서 작업을 실행하기 때문에 여기서 스레드 안전과 관련이 있습니다. 이 상황에서 여러 스레드에서 토네이도를 가장 잘 사용하는 방법에 대한 잘 설명 된 예제를 찾을 수 없었습니다.

apschedulertornado과 어떻게 같이 사용할 수 있습니까?

특정 문제 : 사용 ioloop 토네이도

  1. ? 문서에 따르면 AsyncHTTPClient은 "마법처럼 작동합니다"라고합니다. 글쎄, 마술은 나를 깜짝 놀라게한다. 현재 스레드에서 AsyncHTTPClient을 사용해야합니까, 아니면 기본 스레드를 사용할 수 있습니까 (지정할 수 있습니까)?

  2. 내가 사용하는 ioloop과 관련하여 콜백에 스레드 안전성 문제가 있습니까?

  3. 스레드가 완료되었지만 여전히 호출해야하는 보류중인 콜백/미래가있는 경우 어떻게되는지 분명하지 않습니다. 여기에 문제가 있습니까?

  4. apscheduler는 프로세스 내 스레드로 실행되고 python에는 GIL이 있으므로, 성능면에서 보면 다른 스레드의 다중 루프와는 달리 주 스레드에서 하나의 Ioloop을 갖는 것과 거의 같습니다.)?

+0

안녕하세요 내 대답이 어떤 방식 으로든 도움이 되었습니까? 동일한 정보가 더 필요하시면 의견을 말씀해주십시오. – vaidik

답변

1
  1. 토네이도의 모든 유틸리티는 토네이도의 IOLoop 해결 -이뿐만 아니라 AsyncHTTPClient이 포함되어 있습니다. 그리고 IOLoop은 thread safe로 간주되지 않습니다. 따라서 주 Ioloop을 실행하는 스레드가 아닌 다른 스레드에서 AsyncHTTPClient를 실행하는 것은 좋지 않습니다. IOLoop 사용 방법에 대한 자세한 내용은 read this을 참조하십시오.

  2. tornado.ioloop.IOLoop.instance()을 사용하는 경우 주 스레드의 IOLoop에 콜백을 추가하지 않으려한다고 가정합니다. tornado.ioloop.IOLoop.current()을 사용하여 올바른 스레드에 대한 올바른 IOLoop 인스턴스를 올바르게 참조 할 수 있습니다. 그리고 다른 비 메인 스레드의 IOLoop에서 비 메인 스레드의 IOLoop에 콜백을 추가하기 위해 책을 너무 많이 관리해야합니다. 너무 복잡해집니다.

  3. 나는 이것을 잘 모른다. 그러나 그것을 이해하는 방법에는 두 가지 시나리오가 있습니다. 당신은 IOLoop이있는 스레드 또는 Ioloop이없는 스레드에 대해 이야기하고 있습니다. 스레드가 실행중인 IOLoop을 가지고 있지 않으면 스레드가 완료까지 도달 한 후에 다른 일부 스레드 (아마도 주 스레드)의 IOLoop에 의해 실행되어야하는 콜백이 실행됩니다. 다른 시나리오는 말하는 스레드가 IOLoop을 실행하고 있다는 것입니다. 그런 다음 IOLoop을 중지하지 않으면 스레드가 완료되지 않습니다. 따라서 콜백 실행은 실제로 IOLoop을 중지 할 때 달라집니다.

  4. 솔직히, 나는 토네이도와 함께 스레드를 사용하는 것이별로 보이지 않습니다. 당신이 PyPy를 사용하지 않는 한 어떤 성능 향상도 없을 것입니다. 나는 토네이도가 잘 작동하는지 (모든 것들이 그것에 대해 잘 작동하는 것은 아니며 솔직히 토네이도에 대해서도 잘 모르고 있습니다) 확실하지 않습니다.웹 서버이고 Nginx를 프록시와 LB로 사용한다면 Tornado 앱의 여러 프로세스를 가질 수도 있습니다. apscheduler을 가져 왔으므로, IOLoop의 add_timeout을 사용하는 것이 좋을 것입니다. 이것은 당신이 필요로하는 것과 똑같은 일을합니다. 토네이도는 네이티브입니다. 어쨌든 콜백은 디버깅하기가 어렵습니다. 파이썬의 쓰레딩과 결합하면 막대한 혼란을 겪을 수 있습니다. 다른 옵션을 고려할 준비가되면이 프로세스에서 모든 비동기 처리를 제거하면 훨씬 쉽게 작업을 수행 할 수 있습니다. 이것을 위해서 셀러리 같은 것을 생각해보십시오.

+1

이것에 대한 자세한 정보 주셔서 감사합니다. 이후 gevent를 통해 greenlets를 사용하는쪽으로 옮겼습니다. 그리고 최근 gevent 호환성을 제공하는 APScheduler의 최신 빌드를 사용합니다. 또한 다중 토네이도 프로세스에 부하가 분산됩니다. – Rocketman

+0

토네이도를 사용하여 스레딩을 사용하면 여러 프로세스에 부하를 분산시키는 것이 훨씬 쉽습니다. 경영진이라 할지라도 현명한 선택을하는 것이 현명합니다. 내 답변이 이전 요구 사항/질문에 대한 답변 인 경우 나에게 답을 받아 들일 수 있습니까? – vaidik

관련 문제