multiprocessing.Queue | 您所在的位置:网站首页 › 多进程访问共享内存吗 › multiprocessing.Queue |
一、介绍
multiprocessing.Queue() 是 Python 中 multiprocessing 模块中的一个类,用于在多个进程之间进行通信和数据交换。它可以在多个进程之间安全地传递消息和数据,是一种线程安全的队列实现。 在使用 multiprocessing.Queue() 时,需要注意避免在多个进程之间传递可变对象(如列表、字典等),因为这可能会导致意外的行为。最好传递不可变对象(如整数、字符串等)或使用 multiprocessing.Manager 来创建共享数据结构。 multiprocess.Queue() 是跨进程通信队列,不能用于multiprocessing.Pool多进程的通信。 进程池 multiprocessing.Pool() 的多进程之间的通信要用 multiprocessing.Manager().Queue() 二、函数介绍 参数 def __init__(self, maxsize=0, *, ctx)maxsize:是队列中允许的最大项数。如果省略此参数,则无大小限制。 方法put(item[, block[, timeout]]):将 item 放入队列。 put_nowait():同 put()。 get([block[, timeout]]):从队列中取出一个元素。 get_nowait():同 get()。 注意:当一个队列为空的时候如果再用get取则会堵塞,所以取队列的时候一般是用到 get_nowait()方法,这种方法在向一个空队列取值的时候会抛一个Empty异常 所以更常用的方法是先判断一个队列是否为空,如果不为空则取值。 qsize():返回队列中当前的元素数量。 empty():如果队列为空则返回 True,否则返回 False。 full():如果队列已满则返回 True,否则返回 False。 close():关闭队列,表示不再向队列中添加数据。 join_thread():等待队列中的所有数据被处理完。 cancel_join_thread():取消队列中的所有数据被处理完。 三、代码测试 测试代码1 # -*- coding:utf-8 -*- # @author: 木子川 # @微信公众号: AI算法与电子竞赛 # @Email: [email protected] # @VX:fylaicai import multiprocessing import time def producer(data): while True: for i in range(10): i += 1 data.put(i) time.sleep(1) def consumer(data): while True: result = data.get() print("接收到的数据为:", result) if __name__ == "__main__": data = multiprocessing.Queue() Producer = multiprocessing.Process(target=producer, args=(data, )) Producer.start() Consumer = multiprocessing.Process(target=consumer, args=(data, )) Consumer.start() 测试代码2 # -*- coding:utf-8 -*- # @author: 木子川 # @微信公众号: AI算法与电子竞赛 # @Email: [email protected] # @VX:fylaicai from multiprocessing import Process, Queue import time, random, os def consumer(q): while True: res = q.get() # 收到结束信号则结束 if res is None: break time.sleep(random.randint(1, 3)) print(f'消费者:{os.getpid()},{res}') def producer(q): for i in range(2): time.sleep(random.randint(1, 3)) q.put(i) print(f'生产者: {os.getpid()}, {i}') if __name__ == '__main__': q = Queue() # 生产者们 p1 = Process(target=producer, args=(q,)) # 消费者们 c1 = Process(target=consumer, args=(q,)) p1.start() c1.start() p1.join() # 发送结束信号 q.put(None) print('生产者们完成!') 四、书籍推荐“周志华老师的《机器学习》(西瓜书)是机器学习领域的经典入门教材之一,周老师为了使尽可能多的读者通过西瓜书对机器学习有所了解, 所以在书中对部分公式的推导细节没有详述,但是这对那些想深究公式推导细节的读者来说可能“不太友好”,本书旨在对西瓜书里比较难理解的公式加以解析,以及对部分公式补充具体的推导细节。” 并且本书还有配套的视频讲解,通过书籍和视频一起来加深公式理解。 关注下方公众号:@AI算法与电子竞赛,回复关键字 “PDF” 获取下载地址。 multiprocessing.Queue --- 从队列通信中直接访问的共享内存(2) 五、链接作者欢迎关注我的公众号:@AI算法与电子竞赛 硬性的标准其实限制不了无限可能的我们,所以啊!少年们加油吧! |
CopyRight 2018-2019 实验室设备网 版权所有 |