You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Operations like writelines in the Stream and the Transport APIs provide library authors the opportunity to send collections of buffers that they would like written, sent, etc. in one go. This can be really handy as it takes only one pass (as opposed to multiple passes) through layers of code to prepare buffers before they go out.
Admittedly am not very familiar with libuv's API (so maybe devs here can comment on this), but it appears there are some APIs in libuv like uv_write can take multiple buffers, which can internally redirect to sendmsg or WSASend. This also appears to be true for files with the uv_fs_write API.
However given libuv's own propensity to use scatter/gather IO under-the-hood, it might be worth holding off on queuing write operations until all of the buffers in writelines are collected and prepped. This would allow one larger send, write, etc. to occur and if it is above the high watermark for any buffer (likely?), no additional buffer prepping would be necessary either.
Side note: A separate interesting question would be doing something similar for reading. Not sure there is an API that could leverage this currently (may be wrong about this though). Maybe through pausing and resuming reading one could get close (though likely still leaves something on the table)?
Activity
jakirkham commentedon Sep 8, 2021
After digging into this more I think
uv__try_writeusessendmsg, whichuvloopalready calls in_exec_write, does handle scattering. Plusuvloopalready can collect multiple buffers to send. Souvloopis already doing most of the right things.We would just want to hold off on calling
_queue_writeuntil we have finished processing buffers inwritelines.jakirkham commentedon Oct 1, 2021
Submitted PR ( #445 ) to make the change proposed in the last comment.
jakirkham commentedon Sep 26, 2022
PR ( #445 ) has since been merged and included in the 0.17.0 release
An open question remains around how to do this for reading