Gustavo Oliveira
Gustavo Oliveira

Reputation: 109

Threading not working on multiple connections

I am trying to run two tcp clients from the same code using multithreading. The issue is that the second thread never runs. And main() never reaches the last 'Its here!' string print. I have the following code:

def main():

    t = Thread(None,connect(),None,)
    t2 = Thread(None,connect2(),None,)

    t.start()
    t2.start()

    print "it's here!"

def connect_mktData():

    # create Internet TCP socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # connect to server
    s.connect(('IP', PORT))

    while(1):
        print 'data1'

        k = 'enter a letter1:'
        s.send(k) # send k to server

        v = s.recv(1024) # receive v from server (up to 1024 bytes)
        print v
        time.sleep(1)
    s.close() # close socket


def connect_mktData2():

    # create Internet TCP socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # connect to server
    s.connect(('IP', PORT))

    while(1):
        print 'data2'
        # get letter
        k = raw_input('enter a letter2:')
        s.send(k) # send k to server

        v = s.recv(1024) # receive v from server (up to 1024 bytes)
        print v
        time.sleep(1)
    s.close() # close socket

main()

I get the following output:

data1
enter a letter1:
data1
enter a letter1:
data1
enter a letter1:
data1
enter a letter1:
data1

Even though both functions are mostly identical, ultimately I will have two different connections doing two different things 'simultaneously' and alternating between each other. Shouldn't both threads run independently? thanks for the help!

Upvotes: 1

Views: 248

Answers (1)

dano
dano

Reputation: 94881

It looks like your issue is that this:

t = Thread(None,connect(),None,)
t2 = Thread(None,connect2(),None,)

Should be this:

t = Thread(None,connect,None,)
t2 = Thread(None,connect2,None,)

You want to pass the function objects connect and connect2 to the Thread object. When you use connect() instead of connect, you end up calling connect in the main thread, and then pass its return value to the Thread object, which isn't what you want.

Also, it is much more readable to create the Thread objects like this:

t = Thread(target=connect)
t2 = Thread(target=connect2)

Use the target kwarg, so you don't have to include the None for the group.

Also note that while this will make both functions run in concurrently, they will only truly being running at the same time while they're doing blocking I/O operations (meaning inside send, recv, or raw_input). Because of Python's Global Interpeter Lock (GIL), only one thread can be doing CPU-bound operations at a time. So your threads will end up doing a mixture of true concurrency (during I/O) and cooperative multitasking (during CPU-bound operations).

Upvotes: 1

Related Questions