Appearance
队列
有三种队列, FIFO, LIFO, 以及优先级队列
FIFO
python
import queue
q = queue.Queue()
q.put(1)
q.put("2")
q.put({'num': 3})
print(q.get())
print(q.get())
print(q.get())
bashPS E:\JHY\python\2024-5-10-multithread> python -u "e:\JHY\python\2024-5-10-multithread\main.py" 1 2 {'num': 3}
在获取数据但是没有数据的时候会阻塞进行获取
使用实例udp聊天室
python
import threading
import socket
import queue
def recv_data(udp_socket, q):
while True:
# 接收数据
recv_data = udp_socket.recvfrom(1024)
# 将接收到的数据放入队列中
q.put(recv_data)
print(recv_data)
def send_data(udp_socket, q):
while True:
# 发送数据
send_data = input("请输入要发送的数据:")
# 获取接收方的ip和端口
ip = input("请输入接收方的ip:")
port = int(input("请输入接收方的端口:"))
udp_socket.sendto(send_data.encode("utf-8"), (ip, port))
def save_data(q):
while True:
recv_data = q.get()
with open("recv_data.txt", "a") as f:
f.write(str(recv_data) + "\n")
def main():
# 获取一个udp的socket对象
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口
udp_socket.bind(("", 7788))
# 创建一个队列
q = queue.Queue()
# 创建一个线程
t1 = threading.Thread(target=recv_data, args=(udp_socket, q))
t2 = threading.Thread(target=send_data, args=(udp_socket, q))
t1.start()
t2.start()
t3 = threading.Thread(target=save_data, args=(q,))
t3.start()
if __name__ == '__main__':
main()
LIFO
python
import queue
q = queue.LifoQueue()
q.put(1)
q.put('2')
q.put({'a': 1, 'b': 2})
print(q.get())
print(q.get())
print(q.get())
bashPS E:\JHY\python\2024-5-10-multithread> python -u "e:\JHY\python\2024-5-10-multithread\main.py" {'a': 1, 'b': 2} 2 1
优先级队列
python
import queue
q = queue.PriorityQueue()
q.put((2, 'code'))
q.put((1, 'eat'))
q.put((3, 'sleep'))
while not q.empty():
next_item = q.get()
print(next_item)
bashPS E:\JHY\python\2024-5-10-multithread> python -u "e:\JHY\python\2024-5-10-multithread\main.py" (1, 'eat') (2, 'code') (3, 'sleep')
传入的参数是一个元组, 第一个数字代表优先级, 数字越小优先级越高