代码
"""
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
class PrintHello(threading.Thread):
def run(self):
"""执行 实例.start()时会自动调用run方法"""
print("hello,world " + self.name)
print_task = PrintHello()
print_task.start()
g_num=0
def add_num2(times):
global g_num
for _ in range(times):
g_num += 1
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))
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())
time.sleep(1)
if len(threading.enumerate()) == 1:
print("in practice 3: g_num={}".format(g_num))
break
import socket
print("-" * 100 + "\nUDP聊天器\n" + "-" * 100)
class UdpChat(threading.Thread):
"""多线程udp聊天器"""
def __init__(self, *args, **kwargs):
self.udp_address, self.udp_port, self.chat_address, self.chat_port = self.init_address_port()
self.udp_socket = self.init_udp_socket()
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):
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"):
"""接收消息"""
receive_data = self.udp_socket.recvfrom(1024)
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)
self.udp_socket.sendto(send_data, destination_address)
udp_chat = UdpChat()
udp_chat.start()
while True:
udp_chat.send_message(code="gbk")
运行效果