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')
    '''
    结果 数字越小优先级越高,优先级高的优先出队


  • 相关阅读:
    wxpython的安装

    拓扑排序
    树,二叉树,森林,三者的转换
    二叉树的遍历
    最短路径
    图的遍历
    图的最小生成树
    哈夫曼树的应用
    哈夫曼树
  • 原文地址:https://www.cnblogs.com/mingerlcm/p/11079220.html
Copyright © 2011-2022 走看看