threads and socket question

Discussion in 'Python' started by Gonçalo Rodrigues, Sep 1, 2003.

  1. Hi,

    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.

    With my best regards,
    G. Rodrigues
     
    Gonçalo Rodrigues, Sep 1, 2003
    #1
    1. Advertising

  2. Gonçalo Rodrigues

    Daniel T. Guest

    Gon?alo Rodrigues <> 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()
     
    Daniel T., Sep 1, 2003
    #2
    1. Advertising

  3. On Mon, 01 Sep 2003 01:34:32 GMT, "Daniel T."
    <> wrote:

    >Gon?alo Rodrigues <> 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.
    >


    Thanks for this piece of info. My experiences with my setup confirm
    it.

    I really want to keep the socket-closing in the write thread so my
    problem is reduced to be able to order to read thread to die. What I
    chose to do is to have it periodically check some exit flag to know
    when to exit. I believe this can be done by calling select with a
    timeout before the recv blocking call. Back to the docs and
    Python-experimenting-mode.

    With my best regards,
    G. Rodrigues
     
    Gonçalo Rodrigues, Sep 2, 2003
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Laszlo Nagy
    Replies:
    1
    Views:
    4,861
    Mark Wooding
    Jan 27, 2009
  2. Jean-Paul Calderone
    Replies:
    0
    Views:
    974
    Jean-Paul Calderone
    Jan 27, 2009
  3. Laszlo Nagy
    Replies:
    0
    Views:
    555
    Laszlo Nagy
    Feb 1, 2009
  4. Steve Holden
    Replies:
    0
    Views:
    671
    Steve Holden
    Feb 1, 2009
  5. Steve Holden
    Replies:
    1
    Views:
    725
Loading...

Share This Page