Python简单queue队列与多线程使用演示

环境:Windows10 Python3
源码放在:多线程ZIP暴力破解示例

简单的代码演示

废话不说,先放一段代码:

import threading
import queue
import time

def run_test(q):
    while not q.empty():
        value = q.get()
        time.sleep(0.8)
        # print("值",value)
        # print("线程名",threading.current_thread().name)
        q.task_done()  # 处理完成

def show_test(q, qlen):
    while not q.empty():
        print(q.qsize(),q.unfinished_tasks,qlen )
        time.sleep(1)

def main():
    threadlist = []
    # 创建队列
    q = queue.Queue()  # 不传MaxSize
    qlen = 0 # 记录队列长度
    for i in range(0, 100):  # <=== 加入队列演示
        q.put(i)
        qlen += 1
    # 处理线程
    for x in range(0, 11):  # <=== 运行的线程数量
        th = threading.Thread(target=run_test, args=(q,))
        threadlist.append(th)
    # 进度线程
    threadlist.append(threading.Thread(target=show_test, args=(q, qlen,)))
    # 运行并加入等待运行完成
    for t in threadlist:
        t.start()
    for t in threadlist:
        t.join()

if __name__ == '__main__':
    print("运行")
    main()
    print("结束")

这段代码是我在平时使用经常使用的多线程处理代码,我常用在:批量扫描,暴力破解,数据处理等操作上

代码的main函数中q = queue.Queue()创建了一个不限长度的队列

通过循环模拟生成数据,然后通过q.put(i)将数据加入到队列中

通过循环创建线程,并将线程追加到threadlist中,这样以便于之后的一些操作

run_test函数是用来做线程处理队列演示

show_test函数用来演示定时输出数据

其中Queue的常用方法有:

  • q.qsize(): 返回队列的大小
  • q.unfinished_tasks: 返回队列q.task_done()后的队列的大小
  • q.empty(): 如果队列为空,返回True,反之False
  • q.full(): 如果队列满了,返回True,反之False
  • q.full 与 maxsize 大小对应
  • q.get([block[, timeout]]): 获取队列,timeout等待时间
  • q.get_nowait(): 相当q.get(False)
  • q.put(item, [block[, timeout]]): 写入队列,timeout等待时间
  • q.put_nowait(item): 相当q.put(item, False)
  • q.task_done(): 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
  • q.join(): 实际上意味着等到队列为空,再执行别的操作

我这里特别演示一下q.qsize()q.unfinished_tasks的区别

下面是没注释q.task_done()的效果

Python简单queue队列与多线程使用演示_第1张图片

下面是注释q.task_done()的效果

Python简单queue队列与多线程使用演示_第2张图片

添加显示进度的功能

import threading
import queue
import time

def run_test(q):
    while not q.empty():
        value = q.get()
        time.sleep(0.8)
        # print("值",value)
        # print("线程名",threading.current_thread().name)
        q.task_done()  # 处理完成

# 显示进度 (当前,总数)
def progressbar(nowprogress, toyal):
    get_progress = int((nowprogress+1)*(50/toyal))   # 显示多少>
    get_pro = int(50-get_progress)  # 显示多少-
    percent = (nowprogress+1)*(100/toyal)
    if percent > 100:
        percent = 100
    print("\r"+"["+">"*get_progress+"-"*get_pro+']'+"%.2f" %
          percent + "%", end="")

def show_test(q, qlen):
    while not q.empty():
        # print(q.qsize(),q.unfinished_tasks,qlen )
        progressbar(qlen-q.unfinished_tasks, qlen)
        time.sleep(1)
    progressbar(qlen, qlen)

def main():
    threadlist = []
    # 创建队列
    q = queue.Queue()  # 不传MaxSize
    qlen = 0 # 记录队列长度
    for i in range(0, 100):  # <=== 加入队列演示
        q.put(i)
        qlen += 1
    # 处理线程
    for x in range(0, 10):  # <=== 运行的线程数量
        th = threading.Thread(target=run_test, args=(q,))
        threadlist.append(th)
    # 进度线程
    threadlist.append(threading.Thread(target=show_test, args=(q, qlen,)))
    # 运行并加入等待运行完成
    for t in threadlist:
        t.start()
    for t in threadlist:
        t.join()

if __name__ == '__main__':
    print("运行")
    main()
    print("结束")

代码不过在原先的基础上添加了qlen长度的记录与progressbar进度打印函数

运行效果如下

Python简单queue队列与多线程使用演示_第3张图片

推荐:

  • Python实现简单多线程密码暴力破解程序

你可能感兴趣的:(Python简单queue队列与多线程使用演示)