[Python-ideas] multiprocessing IPC
Mike Meyer
mwm at mired.org
Sun Feb 12 09:02:07 CET 2012
On Sun, 12 Feb 2012 04:46:00 +0100
Sturla Molden <sturla at molden.no> wrote:
> Den 12.02.2012 02:52, skrev Mike Meyer:
> > First, I didn't ask about "BSD mmap", I asked about the "mmap module".
> > They aren't the same thing.
> Take a look at the implementation.
True, but we're talking about an API, not a specific implementation.
> >> When working with multiprocessing for a while, one comes to the
> >> conclusion that we really need named kernel objects.
> > And both the BSD mmap (at least in recent systems) and the mmap module
> > provide objects with names in the file system space. IIUC, while there
> > are systems that won't let you create anonymous objects (like early
> > versions of the mmap module), there aren't any - at least any longer -
> > that won't let you create named objects.
> Sure, you can memory map named files. You can even memory map from
> /dev/shm on a system that supports it, if you are willing to reserve
> some RAM for ramdisk.
And that's *not* the anonymous kernel object you complained about
getting from mmap.
> But apart from that, show me how you would use the mmap module to make
> named shared memory on Linux or Windows. No, memory mapping file object
> -1 or 0 don't count, you get an anonymous memory mapping.
The linux mmap has the same arguments as the BSD one, so I'd expect it
to work the same. I expect that the Python core will have made the
semantics work properly on Windows, but don't really care, and don't
have a Windows system to test it on. And that's why I'm talking about
the API, not the implementation.
> Here is a task for you to try:
>
> 1. start a process
> 2. in the new process, create some shared memory (use the mmap module)
> 3. make the parent process get access to it (should be easy, right?)
> Can you do this? No?
Works exactly like I'd expect it to.
> Show me how you would code this.
Here's the code that creates the shared file:
share_name = '/tmp/xyzzy'
with open(share_name, 'wb') as f:
f.write(b'hello')
Here's the code for the child:
with open(share_name, 'r+b') as f:
share = mmap(f.fileno(), 0)
share[:5] = b'gone\n'
Here's the code for the parent:
child = Process(target=proc)
child.start()
with open(share_name, mode='r+b') as f:
share = mmap(f.fileno(), 0)
while share[0] == ord('h'):
sleep(1)
print('main:', share.readline())
> > > Use named kernel objects for IPC, pickle the name.
> > You don't need to pickle the name if you use mmap's native name system
> > - it's just a string.
> Sure, multiprocessing does not pickle strings objects. Or whatever. Have
> you ever looked at the code?
I didn't say multiprocessing wouldn't pickle the name, *or* anything
else about the multiprocessing module. I said *you* didn't need to
pickle it. And I didn't. Did you read what I wrote?
> Every object passed in the "args" keyword argument to
> multiprocessing.Process is pickled. Same thing for any object you pass
> to multiprocessing.Queue.
Yes, but we're not talking about multiprocessing.Queue. We're talking
about mmap. multiprocessing.Queue doesn't use mmap. For that, you want
to us multiprocessing.Value and multiprocessing.Array.
> Look at the code.
Look at the text.
<mike
--
Mike Meyer <mwm at mired.org> http://www.mired.org/
Independent Software developer/SCM consultant, email for more information.
O< ascii ribbon campaign - stop html mail - www.asciiribbon.org
More information about the Python-ideas
mailing list