Avoid extraneous copy when `_recv`ing bytes through pipes in multiprocessing "connections"
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 77.2k
- Forks
- 36k
- PR merge metrics
- PR metrics pending
Description
Feature or enhancement
Avoid extraneous copy when _recving bytes through pipes in multiprocessing "connections"
Pitch
In the default IPC implementation of the multiprocessing module using pipes, the Connection._recv method is defined as follows:
Seems like we can avoid a copy if we can read directly into a preallocated byte array? This would be beneficial if the bytes we're sending between processes are large. Another benefit here is that the buf.write() call above doesn't release the GIL, so in my workloads I've seen it causing stalls in another thread when trying to read from a multiprocessing.Queue instance.
Sample implementation that avoids the extraneous copy is shown below (bit untested). If it makes sense, I can submit a patch, but probably need some guidance to deal with the Windows case:
import io
def unix_readinto(fd, buf):
# Thanks https://stackoverflow.com/q/13919006/1572989
return io.FileIO(fd, closefd=False).readinto(buf)
class Connection(...):
...
def _recv(self, size, readinto=unix_readinto):
buf = io.BytesIO(initial_bytes=bytes(size))
handle = self._handle
mem = buf.getbuffer()
total = 0
while total != size:
n = readinto(handle, mem[total:])
if n == 0:
if total == 0:
raise EOFError
else:
raise OSError("got end of file during message")
total += n
return buf
Previous discussion
N/A
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with _recv in Lib/multiprocessing/connection.py, linked in the issue, and compare how pipe reads are handled across Unix and Windows. Verify a preallocated buffer can receive large messages without the extra copy while preserving the existing EOF and partial-read behavior on both platforms; the issue does not name specific tests.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- distributed-systems, operating-systems
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100