socket.sendall(), non-blocking sockets, and multi-threaded socket sending
Alan Kennedy
alanmk at hotmail.com
Tue Aug 3 09:11:22 EDT 2004
[Tim Black]
> My application requires sending a large piece (~2MB) of data to
> several devices on a network via TCP sockets. I have experimented with
> different methods for doing this and this has raised some questions
> about the implementation of Python sockets.
>
> (both methods use blocking sockets)
>
> Method 1: Calls socket.sendall(data) for each device in sequence, all
> in a single thread.
>
> Method 2: Each socket has its own thread that calls
> socket.send(datachunk) iteratively until all data is sent.
>
> So Method 1 sends all data to device1, then send all data to device2,
> etc... until all data is sent to all devices. Method 2 sends chunks of
> data to all devices in parallel. What I am seeing is that Method 1 is
> faster than Method 2. Given that the bottleneck is the actual sending
> of data on the sockets and not some latency in processing the message
> at the other end, this result makes sense to me. Method 2 involves
> sending the data in smaller chunks, whereas with Method 1 the
> chunksize is selected by the TCP/IP stack implementation, which is
> probably more efficient. Also, Method 2 entails context switching
> between the send threads.
>
> It turns out that using Method 1, all sendall() calls return
> immediately. I am assuming at this point that my app is in the hands
> of the TCP/IP stack implementation on my machine (win32-XP). Can
> anyone explain what happens inside sendall() for Win32?
>
> Also, I would like to get advice and opinions on what is the most
> efficient way to broadcast data to several devices on a network.
I'd love to have enough time to get into discussing your findings
about sockets. But unfortunately, I don't :-(
But I did want to point out a module that you may not have come across
that makes the job of distributing information peer-to-peer over LANs
very easy: the spread module. I highly recommend that you take a look
over it: it could save you a lot of wheel-reinvention.
http://www.python.org/other/spread/
HTH,
--
alan kennedy
------------------------------------------------------
check http headers here: http://xhaus.com/headers
email alan: http://xhaus.com/contact/alan
More information about the Python-list
mailing list