1 回答

TA貢獻1868條經驗 獲得超4個贊
您不必擔心網(wǎng)絡速度慢;但是您確實必須擔心快速的網(wǎng)絡。
您將無法向網(wǎng)絡寫入比客戶端能夠接受的更多的數(shù)據(jù)。所以你不會領先。
假設您正在分塊閱讀和發(fā)送視頻。您的代碼可能如下所示:
while True:
self.write(chunk)
await self.flush() # write chunk to network
該await self.flush()語句將暫停循環(huán),直到塊被寫入網(wǎng)絡。因此,如果它是一個慢速網(wǎng)絡,它將暫停更長時間。如您所見,您不必擔心遠遠領先于客戶。
但是,如果您的客戶端的網(wǎng)絡很快,那么flush操作也會非常快,這可能會阻塞您的服務器,因為此循環(huán)將繼續(xù)運行,直到所有數(shù)據(jù)都發(fā)送完畢,并且 IOLoop 將沒有機會為其他客戶端提供服務。
對于這些情況,tornado 的維護者 Ben Darnell 在google 論壇帖子中提供了一個非常聰明的解決方案,他稱之為:
以“公平”的速率為每個客戶端提供服務,而不是讓單個客戶端消耗盡可能多的帶寬。
這是代碼(直接取自 Ben Darnell 的帖子):
while True:
# Start the clock to ensure a steady maximum rate
deadline = IOLoop.current().time() + 0.1
# Read a 1MB chunk
self.write(chunk)
await self.flush()
# This sleep will be instant if the deadline has already passed;
# otherwise we'll sleep long enough to keep the transfer
# rate around 10MB/sec (adjust the numbers above as needed
# for your desired transfer rate)
await gen.sleep(deadline)
現(xiàn)在,即使flush操作很快,在下一條語句中,循環(huán)也會休眠到最后期限,從而允許服務器為其他客戶端提供服務。
- 1 回答
- 0 關注
- 159 瀏覽
添加回答
舉報