zoukankan      html  css  js  c++  java
  • python 并发编程 多线程 线程queue

    线程queue

    线程之间已经是共享数据的,为什么还使用线程queue?

    线程需要自己加锁,线程queue帮我们处理好加锁的问题

    有三种不同的用法

    第一种方法:

    class queue.Queue(maxsize=0) #队列:先进先出

    put('four',block=,timeout=)

    第一个参数: 放入的数据

    第二个参数:

    block=True 时 队列满了,再放数据不抛出异常,程序卡主,不指定block参数,默认是True

    block=false时,队列满了,再放数据,不阻塞,抛出异常

    源码

     def put(self, item, block=True, timeout=None):

    第三个参数 timeout:

    设置队列满后,再放数据发生的阻塞时间,如果过了这个时间,还没有取数据,队列还是满的,就抛出异常,就算block=True也抛出异常

    put()  

    设置只能放3个数据,队列满,再去放第四个数据,程序卡主 阻塞了

    默认block参数为True

    import queue
    
    q = queue.Queue(3)  # 先进先出 --> 队列
    
    q.put("first")
    q.put("second")
    q.put("third")
    
    q.put("four")

    block=False时候,队列满了,再放数据,不阻塞,抛出异常

    import queue
    
    q = queue.Queue(3)  # 先进先出 --> 队列
    
    q.put("first")
    q.put("second")
    q.put("third")
    
    q.put("four",block=False)
    
    
    '''
      q.put("four",block=False)
      File "C:UsersAdministratorAppDataLocalProgramsPythonPython36libqueue.py", line 130, in put
        raise Full
    queue.Full
    '''

    timeout

    设置队列满后,再放数据发生的阻塞时间,如果过了这个时间,还没有取数据,队列还是满的,就抛出异常,就算block=True也抛出异常

    阻塞3秒,3秒后,队列还满,抛出异常

    import queue
    
    q = queue.Queue(3)  # 先进先出 --> 队列
    
    q.put("first")
    q.put("second")
    q.put("third")
    
    q.put("four",block=True, timeout=3)
    
    
    '''
      q.put("four",block=True, timeout=3)
      File "C:UsersAdministratorAppDataLocalProgramsPythonPython36libqueue.py", line 141, in put
        raise Full
    queue.Full
    '''

     q.put_nowait('four') ==  q.put('four', block=False)

    import queue
    
    q = queue.Queue(3)  # 先进先出 --> 队列
    
    q.put("first")
    q.put("second")
    q.put("third")
    
    q.put_nowait('four')
    
    '''
     q.put_nowait('four')
      File "C:UsersAdministratorAppDataLocalProgramsPythonPython36libqueue.py", line 184, in put_nowait
        return self.put(item, block=False)
      File "C:UsersAdministratorAppDataLocalProgramsPythonPython36libqueue.py", line 130, in put
        raise Full
    queue.Full
    '''

    取数据 get()

    和put一样

    put(block=,timeout=)

    第一个参数:

    block=True 时 队列取空了数据,再取数据不抛出异常,程序卡主,不指定block参数,默认是True

    block=false时,队列取空数据,再取数据,不阻塞,抛出异常

    第二个参数

    timeout:

    设置队列取空数据,再取数据后的阻塞时间,如果过了这个时间,还没有放数据,队列还是空的,就抛出异常,就算block=True也抛出异常

     源码

    def get(self, block=True, timeout=None):
    import queue
    
    q = queue.Queue(3)  # 先进先出 --> 队列
    
    q.put("first")
    q.put("second")
    q.put("third")
    
    # 取数据
    print(q.get())
    print(q.get())
    print(q.get())
    
    '''
    first
    second
    third
    '''

    队列取完后,再去取数据,程序卡主,阻塞了

    import queue
    
    q = queue.Queue(3)  # 先进先出 --> 队列
    
    q.put("first")
    q.put("second")
    q.put("third")
    
    # 取数据
    print(q.get())
    print(q.get())
    print(q.get())
    print(q.get())

     

    block=False时,队列取完后,再去取数据,抛出异常

    import queue
    
    q = queue.Queue(3)  # 先进先出 --> 队列
    
    q.put("first")
    q.put("second")
    q.put("third")
    
    # 取数据
    print(q.get())
    print(q.get())
    print(q.get())
    print((q.get(block=False)))
    
    '''
        print((q.get(block=False)))
      File "C:UsersAdministratorAppDataLocalProgramsPythonPython36libqueue.py", line 161, in get
        raise Empty
    queue.Empty
    '''

    q.get_nowait()  == q.get(block=False) 一样

    import queue
    
    q = queue.Queue(3)  # 先进先出 --> 队列
    
    q.put("first")
    q.put("second")
    q.put("third")
    
    # 取数据
    print(q.get())
    print(q.get())
    print(q.get())
    print(q.get_nowait())   # == q.get(block=False)
    
    
    '''
       print(q.get_nowait())   # == q.get(block=False)
      File "C:UsersAdministratorAppDataLocalProgramsPythonPython36libqueue.py", line 192, in get_nowait
        return self.get(block=False)
      File "C:UsersAdministratorAppDataLocalProgramsPythonPython36libqueue.py", line 161, in get
        raise Empty
    queue.Empty
    '''

    timeout:

    设置队列取空数据,再取数据后的阻塞时间,如果过了这个时间,还没有放数据,队列还是空的,就抛出异常,就算block=True也抛出异常

    import queue
    
    q = queue.Queue(3)  # 先进先出 --> 队列
    
    q.put("first")
    q.put("second")
    q.put("third")
    
    # 取数据
    print(q.get())
    print(q.get())
    print(q.get())
    print((q.get(block=True, timeout=3)))

    第二种方法:

    class queue.LifoQueue(maxsize=0) #堆栈:后进先出

    用法和Queue类一样

    import queue
    
    q = queue.LifoQueue(3)  # 堆栈:后进先出
    
    q.put("first")
    q.put("second")
    q.put("third")
    
    # 取数据
    print(q.get())
    print(q.get())
    print(q.get())
    
    '''
    third
    second
    first
    '''

    第三种方法

    class queue.PriorityQueue(maxsize=0) #优先级队列:存储数据时可设置优先级的队列

    put进入一个元组,元组的第一个元素是优先级
    (通常是数字,也可以是非数字之间的比较),数字越小优先级越
    第二个元素是放入的数据,可以是列表,字符串,字典等

    import queue
    
    q = queue.PriorityQueue(3)  # 堆栈:后进先出
    
    
    '''
    put进入一个元组,元组的第一个元素是优先级
    (通常是数字,也可以是非数字之间的比较),数字越小优先级越高
    '''
    
    q.put((40,"first"))
    q.put((10,"second"))
    q.put((30,"third"))
    
    # 取数据
    print(q.get())
    print(q.get())
    print(q.get())
    
    
    '''
    结果(数字越小优先级越高,优先级高的优先出队):
    (10, 'second')
    (30, 'third')
    (40, 'first')
    '''
    结果 数字越小优先级越高,优先级高的优先出队


  • 相关阅读:
    VScode 修改中文字体
    missing KW_END at ')' near '<EOF>'
    SQL inner join, join, left join, right join, full outer join
    SQL字符替换函数translater, replace
    SQL COOKBOOK SQL经典实例代码 笔记第一章代码
    sqlcook sql经典实例 emp dept 创建语句
    dateutil 2.5.0 is the minimum required version python
    安装postgresql后找不到服务 postgresql service
    Postgres psql: 致命错误: 角色 "postgres" 不存在
    【西北师大-2108Java】第十六次作业成绩汇总
  • 原文地址:https://www.cnblogs.com/mingerlcm/p/11079220.html
Copyright © 2011-2022 走看看