多线程代码练习题

代码

"""
1、
  使用多线程在终端中打印“hello,world” + 线程名字.

2、
  使用多线程实现:全局变量 g_num=0,使用一个线程,把g_num的值加10次1,
  然后主线程等待1秒,另外一个线程把g_num的值加10次1

3、
  使用互斥锁完成2个线程对同一个全局变量各加100万次的操作

4、
  编写多线程udp聊天器,子线程负责显示接收到的数据,主线程负责获取键盘的数据并发送
"""

import threading
import time


# 1.使用多线程在终端中打印“hello,world” + 线程名字.
class PrintHello(threading.Thread):
    def run(self):
        """执行 实例.start()时会自动调用run方法"""
        print("hello,world " + self.name)

print_task = PrintHello()
# 启动线程
print_task.start()



# 2.使用多线程实现:全局变量 g_num=0,使用一个线程,把g_num的值加10次1,
# 然后主线程等待1秒,另外一个线程把g_num的值加10次1
g_num=0

def add_num2(times):
    global g_num
    for _ in range(times):
        g_num += 1

# target是这个线程要执行的函数, args传递参数给线程, args是一个元组
task2_1 = threading.Thread(target=add_num2, args=(10,))
# 启动线程
task2_1.start()
time.sleep(1)
task2_2 = threading.Thread(target=add_num2, args=(10,))
task2_2.start()
time.sleep(1)
print("in practice 2: g_num={}".format(g_num))


# 3.使用互斥锁完成2个线程对同一个全局变量各加100万次的操作

# 创建锁
mutex = threading.Lock()

def add_num3(times):
    global g_num
    for _ in range(times):
        # 上锁
        mutex.acquire()
        g_num += 1
        # 解锁
        mutex.release()

task3_1 = threading.Thread(target=add_num3, args=(1000000,))
task3_2 = threading.Thread(target=add_num3, args=(1000000,))
# 全局变量
g_num=0
# 启动两个子线程
for task3 in [task3_1, task3_2]:
    task3.start()

while True:
    # 打印当前的线程
    print(threading.enumerate())
    # while True 中休眠一会, 不然CPU占有率过高
    time.sleep(1)
    # 当只剩主线程时, 也就是两个子线程[task3_1, task3_2]执行结束时
    if len(threading.enumerate()) == 1:
        print("in practice 3: g_num={}".format(g_num))
        break


# 4.编写多线程udp聊天器,子线程负责显示接收到的数据,主线程负责获取键盘的数据并发送
import socket


print("-" * 100 + "\nUDP聊天器\n" + "-" * 100)

class UdpChat(threading.Thread):
    """多线程udp聊天器"""
    def __init__(self, *args, **kwargs):
        # 输入udp绑定的地址和端口, 还有聊天时对方的ip地址和端口
        self.udp_address, self.udp_port, self.chat_address, self.chat_port = self.init_address_port()
        # 初始化udp套接字
        self.udp_socket = self.init_udp_socket()
        # 调用父类的__init__方法
        super().__init__(*args, **kwargs)

    def init_address_port(self):
        udp_address = input("请输入udp聊天器绑定的ip地址:").strip()
        udp_port_str = input("请输入udp聊天器的绑定端口:").strip()
        # 检查和转换类型
        udp_port = self.check_port(udp_port_str)
        chat_address = input("请输入udp聊天器的对方的ip地址:").strip()
        chat_port_str = input("请输入udp聊天器对方的端口:").strip()
        chat_port = self.check_port(chat_port_str)

        return udp_address, udp_port, chat_address, chat_port

    @staticmethod
    def check_port(udp_port_str):
        # 当是数字时
        if udp_port_str.isnumeric():
            udp_port = int(udp_port_str)
            # 判断端口范围
            if not (0 < udp_port < 65536):
                raise ValueError("输入的udp端口错误(1-65535)")
            else:
                return udp_port
        # 当不是数字时
        else:
            raise ValueError("输入的udp端口错误(1-65535)")

    def run(self):
        """启动线程时,自动执行run方法"""
        while True:
            ip_address, port, receive_msg = self.receive_message(code="gbk")
            print("接收到[{}:{}]的消息:[{}]".format(ip_address, port, receive_msg))

    def init_udp_socket(self):
        # 创建udp套接字
        self.udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        # 绑定端口
        self.udp_socket.bind((self.udp_address, self.udp_port))
        return self.udp_socket

    def receive_message(self, code="utf-8"):
        """接收消息"""
        # 接收udp信息, 接收1024字节
        receive_data = self.udp_socket.recvfrom(1024)
        # 发送方的ip地址
        ip_address = receive_data[1][0]
        # 发送方的端口
        port = receive_data[1][1]
        # 信息经过解码
        receive_msg = receive_data[0].decode(code)
        # 返回发送方的地址信息和接收到的信息
        return ip_address, port, receive_msg

    def send_message(self, code="utf-8"):
        """发送信息"""
        destination_address = (self.chat_address, self.chat_port)
        # 要发送的字符串信息
        send_msg = input("请输入要发送到[{}:{}]的信息:".format(*destination_address))
        # 编码
        send_data = send_msg.encode(code)
        # 发送udp信息
        self.udp_socket.sendto(send_data, destination_address)


udp_chat = UdpChat()
# 子线程中接收信息
udp_chat.start()
# 主线程中发送信息
while True:
    udp_chat.send_message(code="gbk")

运行效果

多线程代码练习题

猜你喜欢

转载自blog.csdn.net/u010684603/article/details/108292468