python threading 和 queue 结合,多线程去消费一个队列的例子

单线程和多线程耗时对比:(请自行对比,深刻理解)

单线程运行:

"""
@author: zhangjun.xue
@time: 2020/3/30 14:20
@file: threading_queue.py.py
@desc: 多线程去消费一个队列的例子
"""

import threading
import time
import queue


# 下面来通过多线程来处理Queue里面的任务:
def work(q):
    while True:
        if q.empty():
            return
        else:
            t = q.get()
            print("当前线程sleep {} 秒".format(t))
            time.sleep(t)


def main():
    q = queue.Queue()
    for i in range(5):
        q.put(i)  # 往队列里生成消息
    # 单线程
    work(q)

    # 多线程
    # thread_num = 5
    # threads = []
    # for i in range(thread_num):
    #     t = threading.Thread(target=work, args=(q,))
    #     # args需要输出的是一个元组,如果只有一个参数,后面加,表示元组,否则会报错
    #     threads.append(t)
    #
    # for i in range(thread_num):
    #     threads[i].start()
    # for i in range(thread_num):
    #     threads[i].join()


if __name__ == "__main__":
    start = time.time()
    main()
    print('耗时:', time.time() - start)

输出:

当前线程sleep 0 秒
当前线程sleep 1 秒
当前线程sleep 2 秒
当前线程sleep 3 秒
当前线程sleep 4 秒
耗时: 10.000863552093506

两个线程去消费长度为5的队列:

"""
@author: zhangjun.xue
@time: 2020/3/30 14:20
@file: threading_queue.py.py
@desc: 多线程去消费一个队列的例子
"""

import threading
import time
import queue


# 下面来通过多线程来处理Queue里面的任务:
def work(q):
    while True:
        if q.empty():
            return
        else:
            t = q.get()
            print("当前线程sleep {} 秒".format(t))
            time.sleep(t)


def main():
    q = queue.Queue()
    for i in range(5):
        q.put(i)  # 往队列里生成消息
    # 单线程
    # work(q)

    # 多线程
    thread_num = 2
    threads = []
    for i in range(thread_num):
        t = threading.Thread(target=work, args=(q,))
        # args需要输出的是一个元组,如果只有一个参数,后面加,表示元组,否则会报错
        threads.append(t)

    for i in range(thread_num):
        threads[i].start()
    for i in range(thread_num):
        threads[i].join()


if __name__ == "__main__":
    start = time.time()
    main()
    print('耗时:', time.time() - start)

输出:

当前线程sleep 0 秒
当前线程sleep 1 秒
当前线程sleep 2 秒
当前线程sleep 3 秒
当前线程sleep 4 秒
耗时: 6.0027899742126465

5个线程去消费一个长度为5的队列:

"""
@author: zhangjun.xue
@time: 2020/3/30 14:20
@file: threading_queue.py.py
@desc: 多线程去消费一个队列的例子
"""

import threading
import time
import queue


# 下面来通过多线程来处理Queue里面的任务:
def work(q):
    while True:
        if q.empty():
            return
        else:
            t = q.get()
            print("当前线程sleep {} 秒".format(t))
            time.sleep(t)


def main():
    q = queue.Queue()
    for i in range(5):
        q.put(i)  # 往队列里生成消息
    # 单线程
    # work(q)

    # 多线程
    thread_num = 5
    threads = []
    for i in range(thread_num):
        t = threading.Thread(target=work, args=(q,))
        # args需要输出的是一个元组,如果只有一个参数,后面加,表示元组,否则会报错
        threads.append(t)

    for i in range(thread_num):
        threads[i].start()
    for i in range(thread_num):
        threads[i].join()


if __name__ == "__main__":
    start = time.time()
    main()
    print('耗时:', time.time() - start)

输出:

当前线程sleep 0 秒
当前线程sleep 1 秒
当前线程sleep 2 秒
当前线程sleep 3 秒
当前线程sleep 4 秒
耗时: 4.0016114711761475

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值