Skip to content

队列

有三种队列, 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())
bash
PS 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())
bash
PS 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)
bash
PS E:\JHY\python\2024-5-10-multithread> python -u "e:\JHY\python\2024-5-10-multithread\main.py"
(1, 'eat')
(2, 'code')
(3, 'sleep')

传入的参数是一个元组, 第一个数字代表优先级, 数字越小优先级越高