线程
线程是进程中的⼀个实体, 是被系统独⽴调度和分派的基本单位,线程⾃⼰不拥有系统资源,只拥有⼀点⼉在运⾏中必不可少的 资源,但它可与同属⼀个进程的其它线程共享进程所拥有的全部资源。
导入模块
import threading
创建线程
t1= threading.Thread(target=recv,args=(udp_socket,)) # target=函数名,args=(函数参数,); args里的是一个元组,所以要加逗号,其次还有kwargs传参,混合传参这两种方式
开启线程守护
t1.setDaemon(True) # 为了解决主进程结束后,线程继续执行的问题,开启线程守护,当主线程结束,t1也立即结束。需放在 t1.start()的前面
启动线程
t1.start() # 启动线程 并开始执行
阻塞主进程
t1.join() #让主进程会等待t1结束后再结束。需放在 t1.start()后面
多线程应用-UDP聊天器(创建一个线程接收数据,主线程发送数据,主线程结束,接收线程关闭)
import socket,threading # 导入socke,多线程模块
udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp_socket.bind(('',8080))
def send():
a=input('请输入要发送的信息')
udp_socket.sendto(a.encode(),('127.0.0.1',8081))
print('信息发送成功')
def recv(udp_socket):
while True:
b,l=udp_socket.recvfrom(1024)
text=b.decode()
print('对方发来的消息:',text)
def main():
while True:
print('1.发送数据')
print('2.退出系统')
c=input('请选择序号\r')
if c=='1':
send()
elif c=='2':
return
else:
print('请输入合法数据')
if __name__ == '__main__':
t1=threading.Thread(target=recv,args=(udp_socket,)) # 创建一个线程 (
t1.setDaemon(True)
t1.start() # 启动线程,执行线程所关联的函数
main()
udp_socket.close()
多线程应用-简单web服务器(可以同时接收多个客户端的连接并接收它们发送的数据)
import socket
import threading
class Webserver():
def __init__(self):
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
tcp_socket.bind(('192.168.150.102',8080))
tcp_socket.listen(128)
self.tcp_socket=tcp_socket
def start(self):
while True: # 每当有新客户连接时,就会创建一个新的套接字
new_socket, ip_port = self.tcp_socket.accept()
print("新客户来了:", ip_port)
t1=threading.Thread(target=self.handle,args=(new_socket,ip_port))
t1.setDaemon(True)
t1.start()
def handle(self,new_socket,ip_port):
while True: # 支持客户端连接到服务端后,可以一直向服务端发送信息
request_data = new_socket.recv(4096).decode()
if not request_data: # 判断客户端是否断开
new_socket.close()
return
else:
print(ip_port, '发来的信息:', request_data)
if __name__ == '__main__':
ws=Webserver()
ws.start()