Python 线程在多个连接上不起作用

Python 线程在多个连接上不起作用,python,python-2.7,tcp,python-multithreading,Python,Python 2.7,Tcp,Python Multithreading,我正在尝试使用多线程从同一代码运行两个tcp客户端。问题是第二个线程从未运行。main()永远不会到达最后一个“It’s here!”字符串打印。我有以下代码: def main(): t = Thread(None,connect(),None,) t2 = Thread(None,connect2(),None,) t.start() t2.start() print "it's here!" def connect_mktData():

我正在尝试使用多线程从同一代码运行两个tcp客户端。问题是第二个线程从未运行。main()永远不会到达最后一个“It’s here!”字符串打印。我有以下代码:

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

尽管这两个功能基本相同,但最终我会有两个不同的连接“同时”做两件不同的事情,并相互交替。两个线程不应该独立运行吗?谢谢你的帮助

看来您的问题在于:

t = Thread(None,connect(),None,)
t2 = Thread(None,connect2(),None,)
应该是这样的:

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

另外,创建如下
线程
对象更具可读性:

t = Thread(target=connect)
t2 = Thread(target=connect2)
使用
目标
kwarg,这样就不必为
包含


还要注意的是,虽然这将使两个函数同时运行,但它们只有在执行阻塞I/O操作时才能真正同时运行(即在
发送
接收
,或
原始输入
)。由于Python的全局Interpeter锁(GIL),一次只能有一个线程执行CPU限制的操作。因此,您的线程最终将混合执行真正的并发(在I/O期间)和协作多任务(在CPU限制的操作期间)。

您应该使用模块,而不是
线程
模块。
threading
模块的级别更高,并且具有更好的API。实际上,看起来您可能一直在尝试使用它,因为您的代码显示正在使用的
Thread
对象。但它仍然按照我打印的方式运行。