Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于python中线程的混淆_Python_Multithreading - Fatal编程技术网

关于python中线程的混淆

关于python中线程的混淆,python,multithreading,Python,Multithreading,一级初学者。我对python中的线程创建方法感到困惑。具体而言,以下两种方法之间是否存在差异: 在第一种方法中,我使用import-thread模块,然后我用这个thread.start\u new_-thread(myfunction,())创建一个线程,因为myfunction()没有任何参数 在第二种方法中,我使用了from threading import Thread,之后我通过如下操作创建线程:t=Thread(target=myfunction)然后t.start() 我之所以提出

一级初学者。我对python中的线程创建方法感到困惑。具体而言,以下两种方法之间是否存在差异:

  • 在第一种方法中,我使用
    import-thread
    模块,然后我用这个
    thread.start\u new_-thread(myfunction,())
    创建一个线程,因为myfunction()没有任何参数

  • 在第二种方法中,我使用了
    from threading import Thread
    ,之后我通过如下操作创建线程:
    t=Thread(target=myfunction)
    然后
    t.start()

  • 我之所以提出这个问题,是因为我的程序在第二种方法中运行良好,但当我使用第一种方法时,它并没有按照预期的方式运行。我正在开发一个客户机-服务器程序。谢谢

    代码如下:

    #!/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,())
    
    @你能再解释一下吗。我不明白,对不起。主线怎么死?它应该在我的代码中启动service(),然后服务器等待客户端。我想它应该等待而不是死亡

    您的主线程调用:

    start_server()
    
    这就回来了。然后,主线程执行以下操作:

    for i in range(2):
        t = Thread(target=service)
        t.start()
    #thread.start_new_thread(service,())
    
    这些也几乎立即完成,然后你的主线程结束

    这时,主线程就完成了。Python输入其解释器关闭代码

    部分关闭代码正在等待
    .join()
    线程化模块创建的所有(非守护进程)线程。这就是为什么最好不要使用
    thread
    ,除非您确切知道自己在做什么。例如,如果你是我;-)但是我唯一使用
    线程
    的时候是在
    线程
    的实现中,以及为
    线程
    模块编写测试代码


    您完全可以自己管理
    线程
    模块线程生命周期的所有方面。Python的关闭代码不会等待这些线程。解释器只是简单地退出,完全忽略它们,而操作系统会杀死它们(好吧,这真的取决于操作系统,但在我所知道的所有主要平台上,操作系统都会在中途笨拙地杀死它们)。

    为什么“它不能按预期工作”?服务器没有完全启动。我的意思是socket.accept()之前的代码可以工作,但在该程序退出后不会出现任何错误。我可以张贴代码,但这将使这篇文章太长!您当然希望使用更高级的
    线程化
    模块,因此,如果这样做有效,请不要担心较低级的
    线程
    。使用
    线程化
    thread
    是一个较适合专家使用的低级模块,即使他们很少使用它。在Python3中,
    thread
    被重命名为
    \u thread
    ,以进一步阻止它的使用。我猜您的问题在于,当主线程死亡时,它会占用整个进程。然而,当主函数结束时,GC会杀死所有调用其d'tor方法的剩余对象,并且线程会阻止主线程完全结束,直到子线程完成解释任务。我应该在某个地方使用setDaemon(True)吗?但我不知道在哪里。这对我来说是一个有趣的概念,但也有点复杂。建议不要使用守护进程线程,除非你确切知道自己在做什么。相反,努力干净地关闭线程-将线程对象保存在列表中,并显式地
    .join()
    自己关闭它们。一开始你不需要更多的魔法,你需要更少的;-)“显式优于隐式”