线程无法处理多个连接

时间:2014-08-12 15:50:10

标签: python python-2.7 tcp python-multithreading

我正在尝试使用多线程从相同的代码运行两个tcp客户端。问题是第二个线程永远不会运行。并且main()永远不会到达最后'它在这里!'字符串打印。我有以下代码:

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()

我得到以下输出:

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

尽管两个函数大部分都是相同的,但最终我会有两个不同的连接,同时做两个不同的事情并在彼此之间交替。两个线程不应该独立运行吗?谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

看起来您的问题是:

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

应该是这样的:

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

您希望将函数对象connectconnect2传递给Thread对象。当您使用connect()而不是connect时,最终会在主线程中调用connect,然后将其返回值传递给Thread对象,这不是什么你想要的。

此外,创建像这样的Thread对象更具可读性:

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

使用target kwarg,因此您无需为None添加group

另请注意,虽然这会使两个函数同时运行,但它们只会在阻塞I / O操作时同时真正运行(意味着在send内部,recv ,或raw_input)。由于Python的Global Interpeter Lock(GIL),一次只能有一个线程执行CPU绑定操作。因此,您的线程将最终混合使用真正的并发(在I / O期间)和协作式多任务(在CPU绑定操作期间)。