2013-12-22 43 views
2

关卡初学者。我对python中的线程创建方法感到困惑。具体来说有以下两种方法之间有什么区别:关于python中的线程混淆

  1. 在第一种方法中,我使用import thread模块,后来我通过这段代码thread.start_new_thread(myfunction,())作为myfunction的创建线程()没有任何ARGS。

  2. 在第二种方法我使用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,()) 
+0

为什么“它不按预期工作”? –

+0

服务器没有完全启动。我的意思是socket.accept()之前的代码工作,但之后程序退出没有任何错误。我可以发布代码,但它会使这篇文章太长! –

+0

你当然希望使用更高级别的'threading'模块,所以如果可行的话,不要担心更低级别的'thread'。 – shx2

回答

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的关闭代码不会等待这些线程。解释器只是退出,完全忽略它们,操作系统将它们关闭(嗯,这真的取决于操作系统,但是在我知道的操作系统的所有主流平台上,它们都会在中途不正常地杀死它们)。

+0

感谢您的解释。我应该在某处使用setDaemon(True)吗?但我不知道在哪里。这对我来说是一个有趣的概念,但也有点复杂。 –

+0

建议不要使用守护进程线程,除非你确切知道你在做什么。努力干净地关闭你的线程 - 将线程对象保存在列表中,并显式地''.join()'自己。你在开始时不需要*更多*魔法,你需要*少* ;-)“显式比隐式更好” –