我正在尝试使用多线程从相同的代码运行两个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
尽管两个函数大部分都是相同的,但最终我会有两个不同的连接,同时做两个不同的事情并在彼此之间交替。两个线程不应该独立运行吗?谢谢你的帮助!
答案 0 :(得分:1)
看起来您的问题是:
t = Thread(None,connect(),None,)
t2 = Thread(None,connect2(),None,)
应该是这样的:
t = Thread(None,connect,None,)
t2 = Thread(None,connect2,None,)
您希望将函数对象connect
和connect2
传递给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绑定操作期间)。