当前位置: 首页 > news >正文

Python:进程间的通信,进程的操作队列

进程间的队列:

队列的基本操作:
入队:将数据放到队列尾部

出队:从队列的头部取出一个元素

maxsize:队列中能存放数据个数的上限(整数),一旦达到上限插入会导致阻塞,直到队列中的数据被消费掉      maxsize<=0队列大小没有限制
 

队列常用方法:

Queue提供了一个基本FIFO窗口,初始化队列对象q=Queue()

q.empty()  q为空返回True             q.get() 在队列中取值

q.put() 在队列中放值                q.ful() 队列是不是满了

from queue import Queue
q=Queue(3)#初始化队列对象,最多可接受三条消息
q.put('1')
q.put('2')
print(q.full())#False
q.put('3')
print(q.full())#True
#get取出
print(q.get())
print(q.get())
print(q.get())

print(q.empty())#True
print('现在的消息总量是:',q.qsize())#查看消息数量
try:
    q.put('4',True,2)#True是block值,消息队列没空间写入时,程序进入阻塞状态,2代表阻塞时间timeout,2s后还没空间写入,抛出异常
except:
    print('full!!现有消息数量:%s'%q.qsize())

 

from multiprocessing import Process,Queue
import time,random

list=[1,2,3,4]
#写数据进程执行的代码
def write(q1):
    for i in list:
        print(f'将{i}放进队列中')
        q1.put(i)
        time.sleep(random.random())#随机生成0到1之间的浮点数

#读数据进程执行的代码
def read(q2):
    while True:
        if not q2.empty():
            info=q2.get()
            print(f'从队列中获取{info}')
            time.sleep(random.random())
        else:
            break

if __name__=='__main__':
    #实例化队列对象
    q=Queue()
    #创建进程
    p1=Process(target=write,args=(q,))#先写入
    p2 = Process(target=read, args=(q,))

    #启动
    p1.start()
    p1.join()
    p2.start()
    p2.join()


输出结果为:
将1放进队列中
将2放进队列中
将3放进队列中
将4放进队列中
从队列中获取1
从队列中获取2
从队列中获取3
从队列中获取4

进程间的通信:

from multiprocessing import Process,Queue
import time,random

list=[1,2,3,4]
#在列表中写(放)数据
def write(q):
    for i in list:
        print(f'将{i}放进队列中')
        q.put(i)
        time.sleep(random.random())#随机生成0到1之间的浮点数

#在列表中读(取)数据
def read(q):
    while True:
        if not q.empty():
            info=q.get()
            print(f'从队列中获取{info}')
            time.sleep(random.random())
        else:
            break

if __name__=='__main__':
    #创建队列对象
    q=Queue()
    #创建进程
    p1=Process(target=write,args=(q,))#先写入
    p2 = Process(target=read, args=(q,))

    #启动
    p1.start()
    p1.join()
    p2.start()
    p2.join()

    print('end')
http://www.dtcms.com/a/90447.html

相关文章:

  • 什么是ecovadis验厂?ecovadis验厂的好处?ecovadis验厂的重要意义
  • LangGraph 怎么控制递归次数
  • mapbox进阶,添加鹰眼图控件
  • 从零构建大语言模型全栈开发指南:第三部分:训练与优化技术-3.1.1大规模语料库构建(Wikipedia、Common Crawl清洗与分词)
  • 如何通过BinLog日志恢复被删除的数据
  • Linux下解压patchelf - 0.9.tar.gz 文件方法
  • 导游职业资格考试:从迷茫到清晰的备考指南
  • 如何设计一个订单号生成服务?应该考虑那些问题?
  • 真值表向逻辑函数式的转换原理
  • NIO入门
  • 雨锈代码
  • Java-设计模式
  • vulhub靶场Thales通关攻略
  • 记20个忘10个之九:后缀-th
  • 5.go切片和map
  • SAP错题集
  • Spring MVC:从历史演变到实战入门
  • 【react18】react项目使用mock模拟后台接口
  • cmd命令查看电脑的CPU、内存、存储量
  • 简记_单片机硬件最小系统设计
  • 《金庸群侠传》游戏秘籍
  • 加载huggingface数据集报token无效错误解决方案
  • PhotoShop学习02
  • 代码随想录刷题day52|(二叉树篇)106.从中序与后序遍历序列构造二叉树
  • C++中将记录集的数据复制到Excel工作表中的CRange类CopyFromRecordset函数异常怎么捕获
  • 科技赋能,高端气膜料仓重塑储存新标准—轻空间
  • 32位汇编:MASM32环境搭建与汇编窗口程序
  • 基于Babylon.js的Shader入门之六:让Shader反射环境贴图
  • 第30周Java分布式入门 线程池
  • Docker镜像迁移方案