我有一個從文件描述符(包裝在C++端FILE*
中)讀取的Python函數(用C++實現),我需要從asyncio.StreamReader
提供函數。具體而言,讀者是HTTP響應的內容:aiohttp.ClientResponse.content。從asyncio StreamReader將字節泵入文件描述符
我想我可能open a pipe,將讀取端傳遞給C++函數,並將connect the write-end傳遞給asyncio
的事件循環。但是,如何通過適當的流量控制和儘可能少的複製將數據從流讀取器移動到管道?
與缺少的部分代碼的骨架如下:
# obtain the StreamReader from aiohttp
content = aiohttp_client_response.content
# create a pipe
(pipe_read_fd, pipe_write_fd) = os.pipe()
# now I need a suitable protocol to manage the pipe transport
protocol = ?
(pipe_transport, __) = loop.connect_write_pipe(lambda: protocol, pipe_write_fd)
# the protocol should start reading from `content` and writing into the pipe
return pipe_read_fd
這顯示瞭如何打開管道與ASYNCIO寫作,但不顯示如何正確地複製從'asyncio.StreamReader'到管道。特別是,如果從管道讀取的隊伍速度太慢以至於跟不上StreamReader,簡單地從閱讀器讀取字節塊並將它們提供給'transport.write'可能會溢出緩衝區。 –
@JanŠpaček看到我關於寫流控制的編輯,希望有所幫助。 – Vincent