关于python中线程的混淆
一级初学者。我对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() 我之所以提出
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()
自己关闭它们。一开始你不需要更多的魔法,你需要更少的;-)“显式优于隐式”