2017-05-25 110 views
0

API調用異步I已經使用下面的語句如何讓龍捲風

tornado.ioloop.IOLoop.current().start() 

我已經打上我的方法與@ gen.coroutine並返回屈服 爲了檢查方法,開始了我的Web服務器調用是異步的,我增加了time.sleep(5) ,但方法調用都是同步的,它等待5秒,執行下一個語句,任何其他調用龍捲風服務器只是等待第一個調用完成。如何使我的APIS異步

我沒有任何IO調用我的方法,但CPU密集型數學計算。

回答

2

正如您已經指出的那樣,您可以使用tornado.gen.sleep來讓您的協程與睡眠一起工作。但是,最終,這不會幫助你。 異步編程專爲在需要處理IO時執行額外處理的情況而設計。在有CPU工作的情況下,例程繼續運行。因此,即使您使用正確的異步基元,您在運行計算時也會阻塞。

原則上,線程編程在這種情況下效果更好,因爲每個線程可以同時在CPU綁定的工作上運行。但是,這對Python來說無能爲力。由於線程鎖定在Python中的工作方式,基本上一次只能運行一個Python線程。 您可以查看多處理模塊,看看您是否可以在單獨的進程中運行每個計算。這可能是有效利用Python的多CPU系統的最佳方式。

3

從龍捲風文檔:

這樣做的原因是,time.sleep是一個阻塞函數:它不允許控制返回IOLoop,以便其他處理器可以運行。

您可以閱讀更多關於此here

您應該用協程相同的tornado.gen.sleep代替time.sleep