关于python中线程的混淆

时间:2013-12-22 21:53:07

标签: python multithreading

等级初学者。我对python中的线程创建方法感到困惑。具体来说,以下两种方法之间存在任何差异:

  1. 在第一种方法中,我正在使用import thread模块,之后我正在使用此代码thread.start_new_thread(myfunction,())创建一个线程,因为myfunction()没有任何参数。

  2. 在第二种方法中,我使用的是from threading import Thread,之后我通过这样的方式创建线程:t = Thread(target=myfunction)然后t.start()

  3. 我问的原因是因为我的程序适用于第二种方法,但是当我使用第一种方法时,它不能按预期工作。我正在开发一个Client-Server程序。感谢

    代码如下:

    #!/usr/bin/env python
    
    import socket
    from threading import Thread
    import thread
    
    data = 'default'
    tcpSocket = ''
    def start_server():
        global tcpSocket
        tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        tcpSocket.bind(('',1520))
        tcpSocket.listen(3)
        print "Server is up...."
    
    def service():
        global tcpSocket    
        (clientSocket,address) = tcpSocket.accept()
        print "Client connected with: ", address
       #    data = 'default'
    
        send_data(clientSocket,"Server: This is server\n")
        global data
        while len(data):
            data = receive_data(clientSocket)
            send_data(clientSocket,"Client: "+data)
    
        print "Client exited....\nShutting the server"
        clientSocket.close()
        tcpSocket.close()
    
    def send_data(socket,data):
        socket.send(data)
        def receive_data(socket):
        global data 
        data = socket.recv(2048)
        return data
    
    
    start_server()
    
    for i in range(2):
        t = Thread(target=service)
        t.start()
    #thread.start_new_thread(service,())
    

1 个答案:

答案 0 :(得分:2)

  

@immortal你能解释一下吗?我没抱歉。主线如何死?它应该在我的代码中启动service()然后服务器等待客户端。我想它应该等待而不是死。

您的主线程致电:

start_server()

然后返回。然后你的主线程执行:

for i in range(2):
    t = Thread(target=service)
    t.start()
#thread.start_new_thread(service,())

那些也几乎立即完成,然后你的主线程结束。

此时,主线程已完成。 Python输入其解释器关闭代码。

部分关闭代码是等待.join()threading模块创建的所有(非守护程序)线程。除非您确切知道自己在做什么,否则使用thread会更好 的原因之一。例如,如果你是我;-)但我曾经使用thread的唯一时间是在threading实现中,并为此编写测试代码thread模块。

您完全靠自己来管理thread模块线程生活的各个方面。 Python的关闭代码不会等待这些线程。解释器只是退出,完全忽略它们,并且操作系统将它们终止(好吧,这完全取决于操作系统,但在所有主要平台上,我知道操作系统只是在中途不合理地杀死它们。)