Python 队列queue模块,multiprocessing模块

1.常见队列

#!/usr/bin/env python
# --*-- encoding:utf-8 --*--
"""
|queue.Queue|先进先出队列|
|queue.LifoQueue|后进先出队列|
|queue.PriorityQueue|优先级队列|
|queue.deque|双线队列|
"""
#单向队列 ,先进先出
import queue
q = queue.Queue()
q.put(123)
q.put(456)
q.put(789)
print(q.get())  # 123

#单向队列,后进先出
import queue
q = queue.LifoQueue()
q.put(123)
q.put(456)
q.put(789)
print(q.get())  # 789

#优先级队列 ,参数是元组,值越小优先级越高
import queue
q = queue.PriorityQueue()
q.put((4,123))
q.put((3,456))
q.put((2,789))
q.put((1,111))
q.put((0,666))
print(q.get()) # (0,666)


#双向队列
import queue
q = queue.deque()
q.append(123)
q.append(456)
q.appendleft(666)
print(q.pop()) # 456
print(q.popleft()) # 666

2.Queue 常见方法

import queue
q = queue.Queue(maxsize=0)  # 构造一个先进显出队列,maxsize指定队列长度,为0时,表示队列长度无限制。
q.join()    # 等到队列为空的时候,在执行别的操作
q.qsize()   # 返回队列的大小 (不可靠)
q.empty()   # 当队列为空的时候,返回True 否则返回False (不可靠)
q.full()    # 当队列满的时候,返回True,否则返回False (不可靠)
q.put(item, block=True, timeout=None) #  将item放入Queue尾部,item必须存在,可以参数block默认为True,表示当队列满时,会等待队列给出可用位置,
#为False时为非阻塞,此时如果队列已满,会引发queue.Full 异常。 可选参数timeout,表示 会阻塞设置的时间,过后,
#如果队列无法给出放入item的位置,则引发 queue.Full 异常
q.get(block=True, timeout=None) #   移除并返回队列头部的一个值,可选参数block默认为True,表示获取值的时候,如果队列为空,则阻塞,为False时,不阻塞,
#若此时队列为空,则引发 queue.Empty异常。 可选参数timeout,表示会阻塞设置的时候,过后,如果队列为空,则引发Empty异常。
q.put_nowait(item) #   等效于 put(item,block=False)
q.get_nowait() #    等效于 get(item,block=False)

3.生产者与消费者

import threading
import time
import queue

def producer(i):
    q.put(i)

def consumer():
    print(q.get())
    time.sleep(1)

q = queue.Queue()
for i in range(10):
    t = threading.Thread(target=producer,args=(i,))
    t.start()
for i in range(10):
    t = threading.Thread(target=consumer)
    t.start()

 4.multiprocessing是python的多进程管理包,和threading.Thread类似。直接从侧面用subprocesses替换线程使用GIL的方式,由于这一点,multiprocessing模块可以让程序员在给定的机器上充分的利用CPU。

from multiprocessing import Process

def func(arg):
    print('子进程%s'%arg)

if __name__ == '__main__': 
    pc = []
    for i in range(10):
        p = Process(target=func,args=(i,))
        pc.append(p)
        p.start()
    for i in pc:
        p.join()  # 不加这一句,主进程完了,子进程会变成僵尸进程
    print('主进程运行结束')

 

posted @ 2017-05-07 22:16  1916  阅读(515)  评论(0)    收藏  举报