1.队列

队列为一种先进先出(FIFO)的结构,如下所示,显然只能在队列头尾操作元素,不能在中间操作元素

python 使用消息队列更新数据库表信息 python进程消息队列_抛出异常

2.队列模块Queue的使用

from multiprocessing import Queue  #导入队列模块

if __name__ == '__main__':
    q = Queue(3)  # 初始化一个Queue对象,最多可接收三条put消息
    q.put('消息1')  # put为写队列  get为读队列
    q.put('消息2')
    print(q.full())  #此时队列未满,故返回 False
    q.put('消息3')
    print(q.full())  # 此时队列已满,故返回True
    # 由于消息队列已满,下面两个try都将抛出异常
    # 第一个try等待2s抛出异常
    try:
        q.put('消息4',True,2)  # True表示Blcok=True,此时是写阻塞的,
                                # 所谓写阻塞☞当队列被写满后,这段代码会一直阻塞,
                                # 直到等到别的进程/线程来取走(get)队列中数据
    except:
        print('消息对列已满,现有消息队列数量:%s' % q.qsize())
    # 第二个try会立刻抛出异常
    try:
        q.put_nowait('消息4')  # 不等待写入消息
    except:
        print('消息对列已满,现有消息队列数量:%s' % q.qsize())

    # 读取队列中消息
    if not q.empty():  # 读取消息时,先判断队列是否为空,再读取
        print('-----从队列中读消息----')
        for i in range(q.qsize()):
            print(q.get_nowait()) # 不等待取出消息
    # 写入消息
    print('-----从队列中写入消息4----')
    if not q.full():  # 判断队列中消息是否已满
        q.put_nowait('消息4')
    # 再次从队列中读消息
    print('-----再次从队列中读消息----')
    for i in range(q.qsize()):
        print(q.get_nowait())

 

队列常用方法汇总:

Queue.Queue(maxsize=0)   FIFO, 如果maxsize小于1就表示队列长度无限
Queue.LifoQueue(maxsize=0)   LIFO, 如果maxsize小于1就表示队列长度无限
Queue.qsize()   返回队列的大小 
Queue.empty()   如果队列为空,返回True,反之False 
Queue.full()   如果队列满了,返回True,反之False
Queue.get([block[, timeout]])   读队列,timeout等待时间 
Queue.put(item, [block[, timeout]])   写队列,timeout等待时间 ,block=True表示阻塞,False表示非阻塞

Queue.queue.clear()   清空队列

结果如下:

python 使用消息队列更新数据库表信息 python进程消息队列_父进程_02

3.可用消息队列实现进程间通信

可以使用multiprocessing模块的Queue实现多进程之间的数据传递

例子如下:创建连个子进程,一个负责向队列中写入数据,一个负责从队列读取数据

# _*_ coding: UTF-8 _*_
# 开发团队 : 来者可追
# 开发人员 : Administrator
# 开发时间 : 2019/4/17 0017 下午 7:15
# 文件名称 : processpool.py
# 开发工具 : PyCharm

from multiprocessing import Process,Queue
import time

# 向队列中写入数据
def write_task(q): # 参数q为队列
    # print(type(q))
    if not q.full(): # 队列未满则写入
        for i in range(5):
            message = '消息' + str(i)
            q.put(message)  # 写入消息
            print('写入:%s' % message)

# 从队列读取数据
def read_task(q):
    time.sleep(1)
    while not q.empty():  #队列不为空时
        print('读取:%s' % q.get(True, 2))  # 2s未读取到任何消息则抛出异常

if __name__ == "__main__":
    print('-----父进程开始-----')
    q = Queue()    # 父进程创建队列,并传给子进程
    pw = Process(target=write_task, args=(q,)) # 实例化写数据进程
    pr = Process(target=read_task, args=(q,))  # 实例化读数据进程
    pw.start()
    pr.start()
    pw.join()
    pr.join()
    print('-------父进程结束--------')

结果如下:

python 使用消息队列更新数据库表信息 python进程消息队列_父进程_03

Reference