2016-11-14 23 views
0

我對coroutines in Tornado的基本理解是,它們應該可以幫助擴展API服務器,尤其是在處理併發請求方面,每個請求都需要花費大量時間才能完成。然而,在一個簡單的負載測試中,似乎使用協程實際上比使用簡單的阻塞函數調用更糟糕......龍捲風表現更差與協程與沒有?

下面是使用負載測試併發級別爲4的API響應時間的兩個屏幕截圖(即, 4蝗蟲或「用戶」)。/v1端點使用簡單的阻止函數調用,而/ v2端點使用tornado.gen.coroutine。我預計GET/v2/info的平均響應時間將明顯低於GET/v1/info的平均響應時間,但實際上平均響應時間實際上是更高的

GET /v1/info with 4 locusts

GET /v2/info with 4 locusts

我覺得我現在不是做錯了什麼或誤解的一個基本概念。有人可以告訴我爲什麼我的示例項目顯示上述數字?在併發負載下,基於協程的API性能會比簡單的API差嗎?

樣品tornado-loadtest項目:https://github.com/martyychang/tornado-loadtest

回答

1

你的協同程序沒有做任何事情異步這裏,所以協程裝飾是嚴格的開銷。 @coroutine裝飾器僅當您使用yield等待其他協同程序或其他異步操作時纔有用。在這種情況下,你正在做的很慢的事情是cpu-bound,所以你可以做的唯一一件事情就是讓它在協程中更好地工作,就是在yield thread_pool_exector.submit(task)的線程上運行它(儘管這對你的性能無能爲力情況下,感謝蟒GIL)。當你的程序是IO綁定的,或者當你爲外部事件保持連接(「實時」web應用程序)時,協程會提供幫助。

+0

感謝您的信息,本。所以,如果我正確理解你的答案:如果不是做內存計算,那麼緩慢的操作是從互聯網上下載一個大型的文件,那麼協程可能會有用嗎? –

+0

是的,沒錯。 –