进程间通信:消息队列queue(multiprocessing.Queue模块的使用坑点)

同一进程中的多线程间进行资源共享可以通过全局变量来实现,但是不同的进程使用不同区域的内存,则需要消息队列来通信,不同服务器上的进程想要通信则可以使用redis。

消息队列queue有三张模式:

1、python queue模块的FIFO队列先进先出。
2、LIFO类似于堆先进后出。
3、优先级队列级别越低越先出来。

消息队列的一个好处就是可以降低消息队列的耦合性。

消息队列的创建q = multiprocessing.Queue(n)     其中n为这个消息队列最多可以储存的消息数量
向消息队列中传入消息   q.put()  当队列满时则会阻塞

从消息队列中获取消息   q.get()   当队列为空时则会阻塞  所以可以使用  q.get_nowait() 来获取消息

判断消息队列满或者空则使用q.empty()  和   q.full()

下面是一个列子:

import multiprocessing

# 使用到了消息队列q,所以需要传参
def data_put(q):
    # 准备一个列表
    list1 = [1, 2, 4, 5, 7, 9]
    # 向队列中传消息
    for data in list1:
        q.put(data)
    print("消息已经传完")

def data_get(q):
    # 准备一个空列表
    get_data = list()
    while True:
        tmp = q.get()
        get_data.append(tmp)
    # 取完消息后退出循环
        if q.empty():
            break
    print(get_data)


def main():
    # 准备好消息队列
    # 两个进程一个传消息,一个拿消息
    q = multiprocessing.Queue()
    p_put = multiprocessing.Process(target=data_put, args=(q,))
    p_get = multiprocessing.Process(target=data_get, args=(q,))
    p_put.start()
    p_get.start()


if __name__ == "__main__":
    main()


运行结果为:

消息已经传完
[1, 2, 4, 5, 7, 9]

另外备注坑点:

由于将文件名字命名为了queue导致在运行queue模块时一直报如下的错误。下次一定注意不要将文件名字取成模块名字!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值