>  Q&A  >  본문

python - tornado怎么处理非常耗时的定时任务?

代码大致如下:

class MainHandler(RequestHandler):
    def get(self):
        ...
        ...
        
        
def update():
    ...
    ...
    IOLoop.instance().add_timeout(time.time() + 3600, update)
    
   
if __name__ == '__main__':
    application = tornado.web.Application([
        ....
    ])
    server = HTTPServer(application)
    server.start(2) # 开启两个进程
    IOLoop.instance().add_timeout(time.time() + 3600, update)  # 耗时的定时update
    ...
    ...

其中update()是一个特别耗时的任务
目前的做法是加大add_timeout的时间间隔,以避免两个进程全都去做update了

因为对异步编程并不熟,所以想请教一下有没有更合适的做法

ringa_leeringa_lee2741일 전836

모든 응답(4)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-18 09:59:39

    이 작업은 오랫동안 메인 스레드를 차지할 것으로 보이며 구체적인 시간이 확실하지 않으므로 코루틴을 사용하는 것은 당연히 적절하지 않습니다. ThreadPoolExecutor를 사용해 본 다음,yield threadPool.submit(fn)

    을 사용하는 것이 좋습니다.

    회신하다
    0
  • ringa_lee

    ringa_lee2017-04-18 09:59:39

    tornado는 자체 gen 모듈과 함께 제공되며 공식 웹사이트 문서에는 명확한 예가 있습니다

    코루틴을 수행할 수 있습니다. (콜백을 사용하면 로직이 복잡하고 코드를 읽는 것이 피곤합니다. 스레드/프로세스의 경우 예약 문제를 고려해야 합니다.)

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:59:39

    소용없어요. . 다른 것을 고려하지 않고 단일 스레드만 갖고 한 곳에서 너무 오랜 시간을 보내면 정말 차단됩니다.
    아래 코드를 참고하세요.

    으아악

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:59:39

    작업이 네트워크 IO 집약적인지 로컬 IO 집약적/CPU 집약적인지에 따라 다릅니다. 전자인 경우 PeriodicCallback을 사용하고 큐를 구현한 다음 작업자를 작성하는 것이 좋습니다. 혼자서 실행하세요

    회신하다
    0
  • 취소회신하다