记忆碎片之python多进程、进程池和消息队列

python进程与、消息队列Queue、进程池Pool的结合 进程 进程:通俗理解一个运行的程序或者软件,进程是操作系统资源分配的基本的单位。 现实生活中的公司可以理解成是一个进程,公司提供办公资源,员工可以理解为线程。 进程的状态 工作中,任务数往往大于CPU的核数,即一定有一些任务正在执行,而另外一些任务在等待CPU进行执行,因此导致了有了不同的状态。 一个进程默认有一个线程,进程里面可以创建线程,线程是依附在进程里面的,没有进程就没有线程。 多... 阅读详情

温故而知新,可以为师矣

# 多进程
import os
from multiprocessing import Process, current_process


# Process([group[, target[, name[, args[, kwargs]]]]])
# group分组,实际上不怎么使用
# target表示调用对象,传入任务执行函数做为参数,注意是函数名,不带括号
# args表示给调用对象以元组的形式提供 参数,两个参数时args=(m,n),一个参数时args=(m,),注意元组逗号
# kwargs表示调用对象的字典的传参
# name 是别名,相当于给这个进程取一个名字,在进程数量较多时,这个参数比较好用

# 关于进程方法的操作
# start()让进程执行target调用的对象
# join()阻塞,默认情况下,主进程不会等到子进程任务结束后主进程才结束,使用join()可以让主进程等待子进程任务结束后再结束
# terminate()结束当前,无论任务是否完成
# multiprocessing.freeze_support() 在windows上生成GUI等可执行文件时(.exe文件)时,
# 可能会无限开启新窗口或者新进程导致CPU或内存溢出,可以使用该命令解决,
# os.getpid()获取子进程id
# os.getppid()获取父进程id
# is_alive() 返回布尔值,Ture时进程开启

def test(i):
    print(f"----------------子进程{os.getpid()}---------父进程{os.getppid()}---", current_process().name)


# ----------------子进程7720---------父进程10572--- 当前任务1
# ----------------子进程11556---------父进程10572--- 当前任务2
# ----------------子进程8756---------父进程10572--- 当前任务3
# ----------------子进程9400---------父进程10572--- 当前任务4
# ----------------子进程8408---------父进程10572--- 当前任务5

# if __name__ == '__main__':
#     for i in range(1, 6):
#         p = Process(target=test, args=(i,), name="当前任务{}".format(i))
#         p.start()
#         p.join()  # 由于阻塞,速度会降低,但是在进程通讯方面这个方法可以使用

# 进程池
from multiprocessing import Pool, Manager
import time, random


# 部分参数
# pool.apply_async() 异步非阻塞
# pool.apply() 阻塞
# pool.join() 主进程创建或添加任务之后,默认主进程不等待子进程任务结束后再结束,
# 如果主进程任务完成后立马结束,若没有使用join()就会导致进程池中的任务不执行
def worker(msg):
    start_time = time.perf_counter()
    print(f"{msg}开始执行,当前的子进程是{os.getpid()}")
    time.sleep(random.random() * 2)
    stop_time = time.perf_counter()
    print(msg, f"执行完毕,耗时{(stop_time - start_time).__round__(2)}")


def main():
    pool = Pool(3)  # 定义一个进程池,最大进程数为3
    for i in range(0, 11):
        # 每次循环将会用空闲出来的子进程调用目标
        pool.apply_async(func=worker, args=(i,))
    print("开始")
    pool.close()  # 关闭进程池,关闭后pool不再接受新的请求
    pool.join()  # 等待pool所有的子进程执行完成,必须放在close语句之后
    print("结束")


# if __name__ == '__main__':
#     main()

# 进程之间的通信
# Queue的使用
from multiprocessing import Queue, cpu_count


# Queue.qsize() 返回当前队列包含的消息的数量
# Queue.empty() 如果队列为空,返回True,条件判断
# Queue.full() 判断队列是否满来,满了返回True
# Queue.get([block[,timeout]]) 获取队列中的一条消息,然后将其从队列中移除,block默认为True
# Queue.get_nowait() 相当于Queue.get(False)
# Queue.put(item, [block[, timeout]]) 将item消息写入队列,block默认值为True
# Queue.put_nowait() 相当于Queue.put(item,Flase)

# 使用方法
# q = Queue(num) num可以为空或者num为负数时代表可接受的消息无上限
# 关键参数block,如果block使用默认值,且没有设置timeout(单位秒),,如果消息队列空了,则程序被阻塞(停在读取状态),
# 直到从消息队列读到消息位置,如果设置来timeout参数,则会等待timeout秒,若还是没有读取到消息,则抛出Queue.Empty异常;
# 如果block值为False,消息队列如果为空,就会立抛出Queue.Empty异常

# q = Queue(3)  # 初始化一个Queue对象,最多可以接收三条put消息
# q.put("消息1")
# q.put("消息2")
# print(q.full())
# q.put("消息3")
# print(q.full())


# try:
#     q.put("消息4", block=True, timeout=5)
# except Exception as e:
#     print(f"消息队列已满,5秒后报错,现在消息队列的数量是{q.qsize()}", e)
# try:
#     q.put_nowait("消息4")
# except Exception as e:
#     print(f"消息队列已满,直接报错,现在消息队列的数量是{q.qsize()}", e)

# 先判读消息队列是否已满,然后再写入数据
# if not q.full():
#     q.put_nowait("消息4")
# 读取消息时,先判读消息队列是否为空,再读取消息
# if not q.empty():
#     for i in range(q.qsize()):
#         print(f"循环读取消息队列数据{q.get_nowait()}")

# 两个进程之间的通信
# 写入队列消息
def write(q):
    for value in ["A", "B", "C"]:
        print(f"put {value} to queue")
        q.put(value)
        time.sleep(random.random())


# 读取队列消息
def read(q):
    while True:
        if not q.empty():
            value = q.get(True)
            print(f"get {value} from queue")
            time.sleep(random.random())
        else:
            break


# if __name__ == '__main__':
#     # 父进程创建Queue,并把实例q传给各个子进程
#     q = Queue()
#     pw = Process(target=write, args=(q,))
#     pr = Process(target=read, args=(q,))
#     # 启动子进程pw,写入消息
#     pw.start()
#     # 等待pw结束
#     pw.join()
#     # 启动子进程pr,读取消息
#     pr.start()
#     pr.join()
#     print("所有消息都已经读写成功")

# 在进程池中使用Queue
# Pool创建的进程池,需要使用multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue(),否则报错:
# RuntimeError: Queue objects should only be shared between processes through inheritance.
# 错误翻译>>>运行时错误:队列对象只能通过继承在进程之间共享。

def reader(q):
    print(f"reader启动{os.getpid()},父进程为{os.getppid()}")
    for i in range(q.qsize()):
        print(f"reader从Queue获取到消息:{q.get(True)}")


def writer(q):
    print(f"writer{os.getpid()},父进程为{os.getppid()}")
    for i in "laotie":
        q.put(i)
        print(f"writer向Queue写入来消息:{i}")


if __name__ == '__main__':
    print(f"{os.getpid()} start")
    q = Manager().Queue()
    pool = Pool(cpu_count())
    # print(f"当前cpu的信息为{cpu_count()}", type(cpu_count()))  # 当前cpu的信息为4 <class 'int'>
    # 使用阻塞模式创建进程,这样就不需要在reader中使用死循环,就可以让writer执行完在执行reader
    pool.apply(func=writer, args=(q,))
    pool.apply(func=reader, args=(q,))
    # 当进程池close的时候并未关闭进程池,只是会把状态改为不可再插入元素的状态
    pool.close()
    pool.join()
    print(f"{os.getpid()} end")

手把手教你读懂蓝牙BQB射频测试报告:以PRBS9为例的实战分析 本文以蓝牙BQB射频测试中的PRBS9信号为例,提供了一份实战分析指南。文章深入解读了输出功率、调制特性、邻道泄漏等核心测试项,并分享了信号分析仪操作技巧、测试环境搭建要点及设备选型建议,旨在帮助工程师精准解读报告,高效定位问题,确保产品顺利通过认证。 阅读详情

相关推荐

从零搭建A股量化交易系统:开源框架选型与实战部署指南

本文详细介绍了从零搭建A股量化交易系统的完整流程,重点分析了开源框架VNPY和QMT的选型与实战部署。内容涵盖系统架构设计、策略开发、性能优化及实盘过渡方案,为开发者提供了一套完整的A股实盘量化交易解决方案,助力高效构建稳定可靠的量化交易系统。

sugar的博客 1270

python (高级消息队列)普通、进程、进程池的消息队列

一、普通消息队列 from queue import Queue  这个是普通的队列模式,类似于普通列表,先进先出模式,get方法会阻塞请求,直到有数据get出来为止。 import Queue q = Queue.Queue() for i in range(5): q.put(i) while not q.empty(): print q.get() 输出: 0 ...

墨痕诉清风的博客 1341

Revit Dynamo实战:用Excel数据批量生成桥梁模型(附自适应族技巧)

本文详细介绍了如何利用Revit Dynamo结合Excel数据实现桥梁参数化建模,重点讲解了数据驱动建模、自适应族优化及大型项目性能管理三大核心技巧。通过结构化Excel数据、高级自适应族创建和分块处理策略,显著提升桥梁建模效率与设计变更响应能力。

weixin_42520025的博客 386

Python高级——消息队列(Queue)与进程池(Pool)

Queue消息队列 1.创建 import multiprocessing queue = multiprocessing.Queue(队列长度) 2.方法 方法 描述 put 变量名.put(数据),放入数据(如队列已满,则程序进入阻塞状态,等待队列取出后再放入) put_nowait 变量名.put_nowati(数据),放入数据(如队列已满,则...

HMMHMH的博客 1万+

【DeepSeek R1构建本地RAG知识库】数据结构化清洗-知识图谱制作、使用、dify集成

本文探讨了在构建本地RAG(Retrieval-Augmented Generation)系统时,如何通过引入知识图谱来增强系统的知识理解能力。传统的向量数据库和嵌入模型虽然能处理语义匹配,但无法有效捕捉知识间的关联性。知识图谱通过“实体-关系-属性”的结构化表示,能够更好地支持推理、推荐和多跳问答等高级功能。文章详细介绍了知识图谱的基本概念、制作思路,以及如何使用Neo4j图数据库进行知识图谱的构建和查询。通过实例展示了从PDF文件解析到知识图谱入库的全过程,强调了知识图谱在提升RAG系统性能中的重要作用

少说,多做 560

Ego Planner规划算法(下)——Ego Planner程序框架

本系列文章用于学习记录Ego-Planner规划算法的相关内容,本系列文章是在在Fast Planner规划算法系列文章的基础上,展开对Ego Planner的相关介绍,主要包括Ego Planner算法流程和程序框架两部分,主要学习资料是深蓝学院的移动机器人运动规划课程

慕羽★的博客 7256

python 多进程间通信 消息队列

import multiprocessing import time #使用队列,将消息写进队列,需要的进程到队列取 #队列由父进程创建,子进程共享队列 def write(qe): print("启动子进程 write") for chr in ['A','B','C','D','E']: qe.put(chr) time.sleep(1)...

weixin_40938748的博客 1280

ESP32设备驱动-TB6612FNG直流电机驱动

TB6612FNG 是一款出色的双电机驱动器,非常适合将两个小型直流电机(例如微型金属齿轮电机)连接到微控制器,它还可以用于控制单个双极步进电机。 基于 MOSFET 的 H 桥比 L298N 和 Sanyo 的 LB1836M 等旧式驱动器中使用的基于 BJT 的 H 桥效率高得多,后者允许将更多电流输送到电机,而从逻辑电源汲取的电流更少 (对于真正低电压的应用,LB1836 仍然具有 TB6612 的优势)。

视觉与物联智能 3401

Python多进程原理与实现

1 进程的基本概念 什么是进程? ​ 进程就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。 进程的生命周期:创建(New)、...

daiyu__zz的博客 2万+

OpenAI Error: 403 Country, region, or territory not supported [Python]

从OpenAI的API服务中获取数据时,由于你所在的国家、地区或领土不被支持,因此请求被拒绝了

suiusoar 5659

Neo4j:入门基础(二)之导入CSV文件

导入CSV文件的方式  主要的两种方式如下:   1、使用 Cypher 命令LOAD CSV,这种方式可以处理中小型数据(可达10 million条记录)   2、使用批量导入工具neo4j-admin ,用来直接导入大数据集 三、上述方式具体导入过程   1、Cypher 命令LOAD CSV 参数 1、USING PERIODIC COMMIT 300 使用批量提交,每满300条提交一次,防止内存溢出 2、WITH HEADERS 从文件中读取第一行作为参数名,...

Puzzle的博客 3万+

记忆碎片之python多线程、线程安全、GIL锁、local()对象

创建多线程的方式 方式一:通过Thread创建多线程 函数式 方式二:通过继承Thread类创建多线程 class类 多线程和多进程之间区别 多进程是多份程序同时执行 多线程是在一份程序下多个执行指针同时执行 多线程并不需要线程间通信,线程间共享全局变量,进程间不共享全局变量 进程是系统进行资源分配和调度的一个独立单位,线程是进程的一个实体,是CPU调度和分派的基本单位, 它是比...

Python_DJ的博客 340

【DaVinci Developer专题】-23-IDT高阶应用:结构体类型的数组

共8页 目录 1 创建一个Record IDT 2 创建一个Array IDT 3 创建一个S/R Port Interface 4 创建一个Constant 5 导入CFG生成代码的总结 6 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键字: 缩略语/术语 含义 DEV DaVinci Developer .

「汽车电子助手」的博客 1667

python进程池如何重复利用_Python多进程、进程池和内存碎片消息队列,记忆,之,python...

# 多进程import osfrom multiprocessing import Process, current_process# Process([group[, target[, name[, args[, kwargs]]]]])# group分组,实际上不怎么使用# target表示调用对象,传入任务执行函数做为参数,注意是函数名,不带括号# args表示给调用对象以元组的形式提供 参...

weixin_35815766的博客 398

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【AI Agent】《2026年9月 AI Agent全栈开发技术选型专项面试宝典》

《2026年9月 AI Agent全栈开发技术选型专项面试宝典》聚焦LLM、Agent框架、RAG、工具协议、后端、前端及部署六大核心模块,覆盖33道高频真题。内容以实战为纲,强调模型分层(如GPT-4o主用+Claude降级)、LangGraph替代LangChain、PGVector+多模态RAG、MCP协议演进、FastAPI异步架构、SSE流式渲染及K8s可观测性等关键决策,并辅以量化对比与踩坑复盘,助开发者精准应对大厂终面技术权衡题。

小江的记录本 1030

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

关于python进程池先close再join的疑惑

python进程池先close的疑惑

coder 2万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Python多进程消息队列实现进程间通讯

目录1. 进程间的通讯2. 消息队列3. 多进程消息队列Python实现 1. 进程间的通讯 实现进程间的通讯(IPC)的方式有很多种,如:管道,消息队列,共享内存,信号,信号量,套接字 管道 消息队列 共享内存 开辟空间 内存 内存 内存 读写方式 两端读写[双向/单向] 先进先出 覆盖之前的内容 效率 一般 一般 较高 应用 多用于父子进程 广泛灵活 需要注意互斥...

u011865919的博客 1228

python 消息队列_实例详解:python高级编程之消息队列(Queue)与进程池(Pool)

今天为大家带来的内容是:python高级编程之消息队列(Queue)与进程池(Pool),结合了实例的形式详细分析了Python消息队列与进程池的相关原理、使用技巧与操作注意事项!!!Queue消息队列:1.创建2.方法3.进程通信因为进程间不共享全局变量,所以使用Queue进行数据通信,可以在父进程中创建两个字进程,一个往Queue里写数据,一个从Queue里取出数据。代码如下:执行结果:Poo...

weixin_28868927的博客 406

41. Python Queue 多进程的消息队列 PIPE

消息队列: 消息队列是在消息传输过程中保存消息的容器。 消息队列最经典的用法就是消费者和生产者之间通过消息管道来传递消息,消费者和生产生是不通的进程。生产者往管道中写消息,消费者从管道中读消息。 相当于水管,有一个入口和出口,水从入口流入出口流出,这就是一个消息队列 线程或进程往队列里面添加数据,出口从队列里面读数据 左侧多线程往入口处添加完数据,...

weixin_34050389的博客 247

《封号码罗》python爬虫之企某科技网站js逆向(十四)

首先查看ajax加载,可以发现,其所有的数据都是加密方式到前端页面,由前端页面js解密之后再渲染到网页中 根据其关键字 encrypt_data进行全局搜索,寻找js的解密代码 这个地方就是解密代码,但是这里仅仅是调用,所以要进到代码里面去查看 看到这里已经发现t已经是ajax请求过来的数据了,然后是json被返回,所以重点分析这个区域的代码,可以看到,只有a.a.decode(t)调用了t,所以这个地方需要生成两个函数,一个是s,另一个是其包含的这个函数,其他都是固定的字符串,扣下来js直接调用就行

Python_DJ的博客 2万+

《封号码罗》关于js逆向猿人学第一题m值的获取[纯补环境](二十四)

js逆向猿人学第一题,m值的获取,纯补环境

Python_DJ的博客 1万+

解决pyodbc.Error: (‘HY000‘, ‘[HY000] [Microsoft][ODBC Microsoft Access Driver]常见错误 无法打开注册表项“Temporary

经过尝试,问题主要是数据库读写权限的问题 假如需要读写的数据库存放在系统C盘,就会因为权限的问题 pyodbc.Error: ('HY000', '[HY000] [Microsoft][ODBC Microsoft Access Driver]常见错误 无法打开注册表项“Temporary (volatile) Ace DSN for process 0x1cb0 Thread 0x3dc DBC 0x38580c78 在C盘打开数据一看就行了 当把数据库复制到D盘以后 此时程序配置好路径之后就不

Python_DJ的博客 7067

记忆碎片之python线程池、submit()、done()、result()、wait()、as_completed()、map()方法

大量注释,小白一看就懂的多线程及参数使用 threadpool已经不再是主流,但是对于任务数量不断增加的程序,每有一个任务就生成一个线程,最终会导致线程数量的失控,例如,整站爬虫,假设初始只有一个链接a,那么,这个时候只启动一个线程,运行之后,得到这个链接对应页面上的b,c,d,,,等等新的链接,作为新任务,这个时候,就要为这些新的链接生成新的线程,线程数量暴涨。在之后的运行中,线程数量还会不停的...

Python_DJ的博客 6318

python自动化selenium解决click()失败的四种方案

# 单击元素 def click_item(self, element, driver=None): # login_btn.click() # 第一种方式,直接点击 # element.send_keys(Keys.ENTER) # 第二种方式,发送回车按钮 try: driver.execute_script("arguments[0].click();", element) # 第三种方式。使用JS ex

Python_DJ的博客 3427

关于js逆向某日头条参数_signature生成中jsvmp的补环境

逆向js补环境,Proxy和Reflect真香

Python_DJ的博客 3262

关于python爬虫调用js时如何实现debug的骚操作

如何在python爬虫逆向js时,方便的实现debug,即console

Python_DJ的博客 2954
上一篇: 《封号码罗》python爬虫之70行代码破解CSS映射SVG反爬虫(四)
下一篇: 记忆碎片之python多线程、线程安全、GIL锁、local()对象
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值