python-008-线程

线程
线程是进程中的⼀个实体, 是被系统独⽴调度和分派的基本单位,线程⾃⼰不拥有系统资源,只拥有⼀点⼉在运⾏中必不可少的 资源,但它可与同属⼀个进程的其它线程共享进程所拥有的全部资源。
导入模块

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值