我在寫一個使用boost :: asio的Http服務器。對於大文件,爲了避免將整個文件讀入內存併發送到網絡,我使用boost :: asio :: async_write在網絡上發送了部分文件。boost :: async_write大文件和內存消耗
問題是我的生產者(從文件中讀取的函數)比消費者(boost :: asio :: async_write)快得多,這導致了大文件的巨大內存消耗。
我想通過限制緩衝區列表來避免這個問題。這似乎是一個簡單的生產者/消費者問題,但是,我不想在這樣做時阻止一個線程。
我使用boost :: io_service和n個線程的線程池,這個線程池是可配置的,如果我們對大文件有太多的請求,我不想以不再服務任何請求的服務器結束。
所以我的問題是: - 我怎樣才能設計這個機制,而不阻塞線程? - 我是否應該測試列表大小,然後如果它已經太大,產生一個截止時間定時器,它將執行io_service :: post並繼續讀取我的文件? - 有沒有更好的方法來處理?
好吧。假設你通過async_write發送N個字節。開始你的async_write並同時從文件中讀取下N個字節(2個任務後)。然後當你的async_write完成時,重複同樣的事情。因此,您不會在內存中保留尚未發送的任何文件部分。 –