• 技术文章 >Python技术 >Python基础教程

    Python如何实现队列的同步实现

    爱喝马黛茶的安东尼爱喝马黛茶的安东尼2019-07-06 09:20:25原创2157

    队列

    q = Queue.Queue(maxsize = 10) 创建一个“队列”对象。Queue.Queue类即是一个队列的同步实现。队列长度可为或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度。

    q.put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。

    q.get([block[, timeout]])方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常,timeout等待时间。

    q.qsize() 返回队列的大小

    q.empty() 如果队列为空,返回True,反之False

    q.full() 如果队列满了,返回True,反之False

    q.full 与 maxsize 大小对应

    q.get_nowait() 相当q.get(False)

    q.put_nowait(item) 相当q.put(item, False)

    q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号

    q.join() 实际上意味着等到队列为空,再执行别的操作

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    import queue

    d = queue.Queue()

    d.put('1')

    d.put('2')

    d.put('3')

    print(d.get())

    print(d.get())

    print(d.get())

    print(d.get())

    print(d.get(0))

    运行结果:

    1

    2

    3

    1

    2

    3

    报错:

    1

    queue.Empty

    线程操作列表是不安全的。

    相关推荐:《Python视频教程

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    import threading, time

    li = [1, 2, 3, 4, 5]

    def pri():

        while li:

            a = li [-1]

            print(a)

            time.sleep(1)

            try:

                li.remove(a)

            except:

                print('-----', a)

    t1 = threading.Thread(target=pri, args=())

    t1.start()

    t2 = threading.Thread(target=pri, args=())

    t2.start()

    运行结果:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    5

    5

    4

    ----- 5

    4

    3

    ----- 4

    3

    2

    ----- 3

    2

    1

    ----- 2

    1

    ----- 1

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    import threading, queue

    from time import sleep

    from random import randint

    class Production(threading.Thread):

        def run(self):

            while True:

                r = randint(0, 100)

                q.put(r)

                print("生产出来 %s 号包子" %r)

                sleep(1)

    class Proces(threading.Thread):

        def run(self):

            while True:

                re = q.get()

                print('吃掉 %s号包子' %re)

    if __name__ == '__main__':

        q = queue.Queue(10)

        threads = [Production(),Production(),Production(),Proces()]

        for t in threads:

            t.start()

    运行结果:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    生产出来 94 号包子

    生产出来 13 号包子

    生产出来 79 号包子

    吃掉 94号包子

    吃掉 13号包子

    吃掉 79号包子

    生产出来 43 号包子

    吃掉 43号包子

    生产出来 32 号包子

    吃掉 32号包子

    ......

    相关推荐:

    Python如何实现线程条件同步

    专题推荐:python 队列
    上一篇:Python如何实现线程条件同步 下一篇:Python之线程与进程相关介绍

    相关文章推荐

    • Python中的opener()方法是什么• Python如何实现条件变量同步• Python如何实现线程条件同步

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网