Python随心记--线程列队

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python随心记--线程列队相关的知识,希望对你有一定的参考价值。

import threading,time

li = [1,2,3,4,5,6]
def pri():
    while li:
        a = li[-1]
        print(a)
        time.sleep(1)
        li.remove(a)
        try:
            li.remove(a)
        except Exception as e:
            print(a,e)

t1 = threading.Thread(target=pri,args=())
t1.start()
t2 = threading.Thread(target=pri,args=())
t2.start()
先进先出
import queue   #线程队列 2.7的时候q为大写

q = queue.Queue(3)   #FIFO 默认 1先进先出 2先进后出 3后进先出

q.put(12)
q.put(hello)
q.put({name:aaron})
q.put(123,False)   #如果已满就不再加进去

while 1:
    data = q.get()
    #data = q.get(block = False)

    print(data)
    print(------------------)
先进后出
import queue   #线程队列 2.7的时候q为大写

q = queue.LifoQueue()   #FIFO 默认 1先进先出 2先进后出 3后进先出

q.put(12)
q.put(hello)
q.put({name:aaron})
q.put(123,False)   #如果已满就不再加进去

while 1:
    data = q.get()

    print(data)
    print(------------------)

import queue   #线程队列 2.7的时候q为大写

q = queue.LifoQueue()

q.put(12)
q.put(hello)
q.put({name:aaron})
q.put(123,False)   #如果已满就不再加进去

print(q.qsize())
print(q.empty())
print(q.full())
print(q.task_done())   #在完成任务之后q.task_done函数向任务已经完成的队列发送一个信号
print(q.join())
生成消费者模型:通过一个容器来解决生产者和消费者的强耦合问题
import queue,threading,time,random

q = queue.Queue()

def Producter(name):
    count = 0
    while count < 10:
        print(making..............)
        time.sleep(random.randrange(3))
        q.put(count)
        print(Producter %s has producter %s baozi。。 %(name,count))

        count += 1
        print(ok........)

def Consumer(name):
    count = 0

    while count < 10:
        time.sleep(random.randrange(4))

        if not q.empty():
            data = q.get()

            print(data)
            print(33[32;1mConsumer %s has eat %s baozi..33[0m %(name,count))
        else:
            print(no baozi anymore)
        count += 1


p = threading.Thread(target=Producter,args=(A,))
c = threading.Thread(target=Consumer,args=(B,))

p.start()
c.start()
存在问题版本
import queue,threading,time,random

q = queue.Queue()

def Producter(name):
    count = 0
    while count < 10:
        print(making..............)
        time.sleep(random.randrange(3))
        q.put(count)
        print(Producter %s has producter %s baozi。。 %(name,count))

        count += 1

        q.task_done()
        #q.join()
        print(ok........)

def Consumer(name):
    count = 0

    while count < 10:
        time.sleep(random.randrange(4))

        if not q.empty():
            data = q.get()
            #q.task_done()
            q.join()
            print(33[32;1mConsumer %s has eat %s baozi..33[0m %(name,data))
        else:
            print(no baozi anymore)
        count += 1


p = threading.Thread(target=Producter,args=(A,))
c1 = threading.Thread(target=Consumer,args=(B,))
c2 = threading.Thread(target=Consumer,args=(C,))
c3 = threading.Thread(target=Consumer,args=(D,))

p.start()
c1.start()
c2.start()
c3.start()
解决问题版本
import queue,threading,time,random

q = queue.Queue()

def Producter(name):
    count = 0
    while count < 10:
        print(making..............)
        time.sleep(5)
        q.put(count)
        print(Producter %s has producter %s baozi。。 %(name,count))

        count += 1

        q.task_done()
        #q.join()
        print(ok........)

def Consumer(name):
    count = 0

    while count < 10:
        time.sleep(random.randrange(4))
        print(waiting...........)
        q.join()
        data = q.get()
        #q.task_done()

        print(33[32;1mConsumer %s has eat %s baozi..33[0m %(name,data))

        count += 1


p = threading.Thread(target=Producter,args=(A,))
c1 = threading.Thread(target=Consumer,args=(B,))
c2 = threading.Thread(target=Consumer,args=(C,))
c3 = threading.Thread(target=Consumer,args=(D,))

p.start()
c1.start()
c2.start()
c3.start()

import queue,threading,time,random

q = queue.Queue()

def Producter(name):
    count = 0
    while count < 10:
        print(making..............)
        time.sleep(5)
        q.put(count)
        print(Producter %s has producter %s baozi。。 %(name,count))

        count += 1

        # q.task_done()
        q.join()
        print(ok........)

def Consumer(name):
    count = 0

    while count < 10:
        time.sleep(random.randrange(4))

        # q.join()
        data = q.get()
        print(eating...........)
        time.sleep(4)

        q.task_done()

        print(33[32;1mConsumer %s has eat %s baozi..33[0m %(name,data))

        count += 1


p = threading.Thread(target=Producter,args=(A,))
c1 = threading.Thread(target=Consumer,args=(B,))
c2 = threading.Thread(target=Consumer,args=(C,))
c3 = threading.Thread(target=Consumer,args=(D,))

p.start()
c1.start()
c2.start()
c3.start()

 

以上是关于Python随心记--线程列队的主要内容,如果未能解决你的问题,请参考以下文章

Python随心记--装饰器

Python随心记

Python随心记--进程调用

Python随心记--三元运算

Python随心记--用户登录锁定

Python随心记--socketserver:实现并发