threads and socket question
Daniel T.
postmaster at earthlink.net
Sun Aug 31 21:34:32 EDT 2003
Gon?alo Rodrigues <op73418 at mail.telepac.pt> wrote:
> My setup is the following: I have socket s from which I want to read
> and write. So I made the following set up:
>
> There is a thread whose only job is to read. Any data read (from recv
> call) is just passed to (some) Queue. This thread is "owned" by a
> second thread waiting on a Queue for write requests. The thread just
> pops these from the Queue, and calls the send method from the socket.
> This thread also takes care of closing the socket or (possibly)
> handling any exceptions raised due to socket operation.
>
> So my question is: since I have two threads sharing the same socket,
> even though one is only reading and the other does everything else, do
> I have to watch out for any "concurrency" issues?
>
> P.S: This is for learning experience. So it's of no use telling me
> that I should learn Twisted :-) I may (eventually) get there, but at
> the moment I feel more omfortable with working with plain blocking
> sockets.
The first problem I can think of is the one that stopped me. Note the
code below... You can't close a blocked socket in python even from a
separate thread.
import unittest
import socket
import threading
import time
class SocketAcceptor ( threading.Thread ):
def __init__( self, socket ):
threading.Thread.__init__( self )
self.socket = socket
self.done = 0
def run( self ):
self.socket.bind( ( "", 3424 ) )
self.socket.listen( 5 )
try:
child, ip = self.socket.accept()
except:
pass
self.done = 1
class SocketTester ( unittest.TestCase ):
def testClose( self ):
ss = socket.socket()
acceptor_thread = SocketAcceptor( ss )
acceptor_thread.start()
time.sleep( 1 )
ss.close()
time.sleep( 1 )
self.assertEquals( acceptor_thread.done, 1 )
if __name__ == '__main__':
unittest.main()
More information about the Python-list
mailing list