threads and socket question

Daniel T. postmaster at earthlink.net
Mon Sep 1 03:34:32 CEST 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