python - tornado怎么处理非常耗时的定时任务?
ringa_lee
ringa_lee 2017-04-18 09:57:39
0
4
868

代码大致如下:

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_lee
ringa_lee

ringa_lee

membalas semua(4)
Ty80

Nampaknya tugas ini akan menduduki urutan utama untuk masa yang lama dan masa tertentu tidak pasti, jadi menggunakan coroutine jelas tidak sesuai. Adalah disyorkan untuk mencuba ThreadPoolExecutor, dan kemudian gunakan yield threadPool.submit(fn)

左手右手慢动作

puting beliung datang dengan modul gennya sendiri, dan dokumentasi tapak web rasminya mempunyai contoh yang jelas

Anda boleh membuat coroutine (Dengan panggilan balik, logiknya rumit dan memenatkan membaca kod; untuk urutan/proses, isu penjadualan perlu dipertimbangkan)

伊谢尔伦

Ia tidak berguna. . Jika anda tidak mempertimbangkan perkara lain, jika anda mempunyai satu utas dan menghabiskan terlalu lama di satu tempat, ia benar-benar disekat.
Rujuk kod di bawah:

class TestHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    @tornado.gen.coroutine
    def get(self):
        yield gen.Task(self.sleep)
        self.write('ok')
        self.finish()

    def sleep(self, callback):
        for i in range(100000000):
            if i % 100000 == 0:
                pass
        print('ooo')
        callback()
大家讲道理

Ia bergantung pada sama ada tugas anda adalah intensif IO rangkaian atau intensif IO tempatan/Intensif CPU Jika ia adalah yang pertama, hanya gunakan PeriodicCallback Jika ia adalah yang kedua, adalah disyorkan untuk melaksanakan baris gilir dan kemudian tulis pekerja jalankan sahaja

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan