进程池和进程之间的通信

CANoe LIN一致性测试之干扰测试Test moudle_LIN Disturbance Block 注意:相邻两个显隐性不同的bit不允许干扰,例如我同时选择bit6和bit7,相邻两个同显隐性的bit允许干扰,例如当我选择bit3和bit4,项,这里我选择ID:为0x2F(PID:0x6F)的frame。需按照具体测试规范实施干扰项,帧头和数据段都可以实现干扰。最近发现一个干扰测试模块,下面是一些具体使用方法。选择干扰项:PID的奇偶校验位(一致性测试干扰测试之手动测试。一个待测试frameD。 阅读详情

进程池和进程之间的通信

进程池
  • 什么是进程池?

    进程池就是预先创建好的进程的耳机和,可以向进程池中进程指派任务,不必反复创建和销毁进程。

  • 使用进程池的好处:

    批量创建多个进程,让程序执行完任务之后,再讲进程销毁,下次再有任务是,重新创建新的进程,这样频繁创建和销毁进程太浪费cpu。

    更好的方式就是,预先创建好一批进程,为它们分配任务,任务完成之后,还可以再次给他们分配任务,而不是直接销毁。

  • 创建进程池的步骤:

    • 1、导入模块
    from multiprocessing.pool import Pool
    • 2、创建进程池对象,指定其中进程的个数:
    my_pool = Pool(3)   # 默认不写的话,进程池中进程个数默认是cpu的核心数
    
    # os.cpu_count() 获取当前CPU的核心数
    
    • 3、向进程中添加任务
    my_pool.apply_async(要调用的目标,(传递给目标的参数元组))   # 异步添加,会将任务全部添加到进程池中
    
    my_pool.apply(要调用的目标,(传递给目标的参数元组))   # 同步添加,一次只能添加一个任务,前一任务完成之后,才开始下一个。
    • 4、关闭进程池,不再向其中添加任务,不会结束所有进程
    my_pool.close()
    • 5、等待进程池所有的进程结束
    my_pool.join()
  • multiprocessing.Pool常用函数解析:

    • apply_async(func[, args[, kwds]]) :使用非阻塞方式调用func(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程),args为传递给func的参数列表,kwds为传递给func的关键字参数列表;
    • apply(func[, args[, kwds]]):使用阻塞方式调用func
    • close():关闭Pool,使其不再接受新的任务;
    • terminate():不管任务是否完成,立即终止;
    • join():主进程阻塞,等待子进程的退出, 必须在close或terminate之后使用;

    Demo:

import os
import random
from multiprocessing.pool import Pool

import time


def task(id):
    # 开始时间
    start_time = time.time()

    print(">>>> %d 任务开始执行, pid = %s" % (id, os.getpid()))
    time.sleep(random.random() * 2)
    # 结束时间
    end_time = time.time()
    print(">>>> %d 任务执行完毕, pid = %s, 耗时:%.2f" % (id, os.getpid(), (end_time - start_time)))


def main():
    print("父进程pid = %d" % os.getpid())

    # 1、创建进程池 指定其中进程的个数
    my_pool = Pool(4)
    # 2、向进程中添加任务
    for _id in range(10):
        my_pool.apply_async(task, (_id,))
    print("任务添加完成")

    # 3、关闭进程池,不再向其中添加任务
    my_pool.close()

    # 4、等待进程池中所有的进程结束
    my_pool.join()
    print("任务执行完毕")

if __name__ == '__main__':
    main()

​ 运行结果:

父进程pid = 14908
任务添加完成
>>>> 0 任务开始执行, pid = 15392
>>>> 1 任务开始执行, pid = 6672
>>>> 2 任务开始执行, pid = 4452
>>>> 3 任务开始执行, pid = 6236
>>>> 2 任务执行完毕, pid = 4452, 耗时:0.11
>>>> 4 任务开始执行, pid = 4452
>>>> 3 任务执行完毕, pid = 6236, 耗时:0.70
>>>> 5 任务开始执行, pid = 6236
>>>> 5 任务执行完毕, pid = 6236, 耗时:0.38
>>>> 6 任务开始执行, pid = 6236
>>>> 4 任务执行完毕, pid = 4452, 耗时:1.55
>>>> 7 任务开始执行, pid = 4452
>>>> 0 任务执行完毕, pid = 15392, 耗时:1.75
>>>> 8 任务开始执行, pid = 15392
>>>> 7 任务执行完毕, pid = 4452, 耗时:0.08
>>>> 9 任务开始执行, pid = 4452
>>>> 1 任务执行完毕, pid = 6672, 耗时:1.79
>>>> 8 任务执行完毕, pid = 15392, 耗时:0.15
>>>> 9 任务执行完毕, pid = 4452, 耗时:0.84
>>>> 6 任务执行完毕, pid = 6236, 耗时:1.76
任务执行完毕
进程和进程之间的通信-Queue

Demo:

import os
import random
from multiprocessing import Queue, Process

import time


def write_task(q):

    for s in ("Hello", "World", "Python", "end"):
        q.put(s)
        print("%s 进程,正在添加数据----%s" % (os.getpid(), s))
        time.sleep(random.random() * 2)

    print("%s 进程, 将要完成任务" % os.getpid())


def read_task(q):

    while True:
        msg = q.get()
        if msg == "end":
            print("%s 进程将要结束。。。" % os.getpid())
            break

        print("%s 进程,正在读取数据---%s" % (os.getpid(), msg))
        time.sleep(random.random() * 2)


def main():
    # 创建消息队列
    q = Queue()

    # 创建进程,
    _write = Process(target=write_task, args=(q,))
    _read = Process(target=read_task, args=(q,))

    # 启动进程
    _write.start()
    _read.start()

    _read.join()
    _read.join()

    print("父进程完成任务了..............")

if __name__ == '__main__':
    main()

​ 运行结果:

15580 进程,正在添加数据----Hello
9596 进程,正在读取数据---Hello
15580 进程,正在添加数据----World
9596 进程,正在读取数据---World
15580 进程,正在添加数据----Python
15580 进程,正在添加数据----end
15580 进程, 将要完成任务
9596 进程,正在读取数据---Python
9596 进程将要结束。。。
父进程完成任务了..............

说明:

​ 初始化Queue对象时,若括号中没有指定最大可接收的消息数量,或数量为负值,那么就代表可接收的消息数量没有上限(直到内存的尽头)

  • Queue.qsize():返回当前队列包含的消息数量
  • Queue.empty():如果队列为空,返回True,反之False
  • Queue.full():如果队列满了,返回True,反之False
  • Queue.get([block[, timeout]]):获取队列中的一条消息,然后将其从队列中删除,block默认值为True
    • 如果block使用默认值,且没有设置timeout(单位秒),消息队列如果为空,此时程序将被阻塞(停在读取状态),知道消息队列读到消息为止,如果设置了timeout,则会等待timeout秒,若还没有读取到任何消息,则会抛出“Queue.Empty”异常。
    • 如果block返回值为False,消息队列为空,则会立刻抛出“Queue.Empty”异常。
  • Queue.get_nowait():相当于Queue.get(False)
  • Queue.put(item,[block[, timeout]]):将item消息写入队列,block默认值为True
    • 如果block使用默认值,且没有设置timeout(单位秒),消息列队如果已经没有空间可写入,此时程序将被阻塞(停在写入状态),直到从消息列队腾出空间为止,如果设置了timeout,则会等待timeout秒,若还没空间,则抛出”Queue.Full”异常;
    • 如果block值为False,消息列队如果没有空间可写入,则会立刻抛出”Queue.Full”异常;
  • Queue.put_nowait(item):相当于Queue.put(item,False)
进程池中的Queue

​ 如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue(),否则会得到一条如下的错误信息:

RuntimeError: Queue objects should only be shared between processes through inheritance.

​ Demo:

import os
import random
from multiprocessing.pool import Pool

from multiprocessing import Manager

import time


def write_task(q):
    for s in ("Hello", "World", "Python", "end"):
        q.put(s)
        print("%s 进程,正在添加数据---%s" % (os.getpid(), s))
        time.sleep(random.random() * 2)

    print("%s 进程,将要结束任务......." % os.getpid())


def read_task(q):
    while True:
        msg = q.get()
        if msg == "end":
            print("%s 进程,将要读取完毕...." % os.getpid())
            break

        print("%s 进程读取到消息%s" % (os.getpid(), msg))
        time.sleep(random.random() * 2)


def main():
    # 创建进程间通讯的工具
    q = Manager().Queue()  # 进程池中使用消息队列,必须使用Manager().Queue()
    # 创建线程池对象
    p = Pool(2)
    # 使用同步添加任务的话,程序只能一个任务一个的添加,只能先put再get
    p.apply_async(write_task, (q,))
    p.apply_async(read_task, (q,))

    p.close()
    p.join()

    print("主进程执行完毕")


if __name__ == '__main__':
    main()

​ 执行效果 :

11532 进程,正在添加数据---Hello
14016 进程读取到消息Hello
11532 进程,正在添加数据---World
14016 进程读取到消息World
11532 进程,正在添加数据---Python
14016 进程读取到消息Python
11532 进程,正在添加数据---end
14016 进程,将要读取完毕....
11532 进程,将要结束任务.......
主进程执行完毕
Himall商城ExpressDaDaHelper 取消订单(线上环境) 阅读详情

相关推荐

AMD 3D V-Cache技术解析:CPU缓存堆叠如何突破性能瓶颈

在半导体领域,缓存(Cache)是提升处理器性能的关键技术,其核心原理是在高速CPU核心与慢速主存之间建立数据中转站,以缓解“内存墙”问题。随着摩尔定律放缓,传统平面扩展缓存面临面积成本高、延迟增加等挑战。3D封装技术应运而生,通过垂直堆叠实现极致的互联密度与带宽,成为突破性能瓶颈的重要工程路径。这项技术的价值在于能以更优的功耗和延迟,显著提升缓存容量,从而改善游戏、科学计算等数据密集型应用的性能。以AMD 3D V-Cache为代表的Hybrid Bonding(混合键合)工艺,正是这一趋势的典型实践,它

weixin_30432579的博客 418

进程池和进程间通信

在需要频繁的创建删除较多进程的情况下,导致计算机资源消耗过多 进程池如何处理 1. 创建进程池,在池内放入适量的进程 2. 将事件加入进程池等待队列 3. 使用进程池中的进程不断处理事件 4. 所有事件处理后,回收关闭进程池   from multiprocessing import Pool   Pool() 功能 : 创建进程池 参数 : processes : 指定进程...

qq_15551663的博客 612

Odoo 集成ReportBro报表设计器支持13,14,15,16,17,18,19

Odoo 集成ReportBro零代码报表设计器,ReportBro设计器 一个用于创建PDF和XLSX报告模板的javascript插件。

zxltwins的博客 3379

python之进程池、进程间通讯之用例、避坑(持续更新)

(a)需要引入以下模块(b)建议使用以下的方式,将会在执行完任务后,主动释放进程池但需要注意的是self.poolNum是创建进程数量。windows系统中最小数量是1,最大数量是61,除此之外会报错。pass(c)参数说明:工作进程数量。mp_context:进程上下文。如果None,则会以默认的进程上下文执行。:函数,启动进程前会执行这个函数。initargs:元组格式的参数,传参给的函数。(d)并发函数submit:异步提交任务。返回Future对象。Future。

qq_15855921的博客 2197

你的OLED屏和MPU6050为啥通信失败?从IIC的7位地址冲突讲起

本文深入解析OLED屏与MPU6050传感器在I2C总线上的通信故障,重点探讨7位地址冲突问题。通过分析I2C协议中的地址分配机制,提供硬件调整和软件调试的完整解决方案,帮助开发者有效排查和解决设备无响应问题。

weixin_26876073的博客 151

医学图像配准实战:用Python实现MIND特征提取(附完整代码)

本文详细介绍了MIND(模态无关邻域描述符)在医学图像配准中的应用。通过Python和PyTorch实战,从原理到代码逐步解析了如何提取MIND特征,并利用其对结构而非灰度的感知能力,有效解决CT、MRI等多模态图像的对齐难题,为病灶追踪、手术导航等高级应用提供鲁棒性基础。

263

进程池间的通信

import time from multiprocessing import Process from multiprocessing import Manager from multiprocessing import Pool def write(queue): for i in range(10): print(f'往队列中放入元素{i}') queue.put(i) time.sleep(1) def read(queue): .

u010819718的博客 218

32、社交媒体大数据中的情感分析与网络欺凌检测

本文探讨了社交媒体大数据在情感分析和网络欺凌检测中的应用。情感分析有助于应对自动化带来的社会变化、促进社会包容和推动环境保护。网络欺凌作为一种严重的在线危害,其检测依赖于数据预处理、特征提取与深度学习模型(如CNN、LSTM)进行分类。文章还总结了大数据在欺诈检测、医疗、制造、交通等领域的广泛应用,并分析了数据存储、处理速度、质量和技术工具等方面的挑战,提出了相应的应对策略。未来,随着技术进步,社交媒体大数据将在更多领域发挥关键作用。

cc789的博客 92

进程池间的进程通信

进程池 当需要创建的子进程数据不多时,可以直接利用multiprocessing中的Process动态生成多个进程,但是如果是百上千个目标,手动的去创建里程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法 初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程来执行该请求,但是如果池中的进程数已经达到指定的...

weixin_45905671的博客 174

PCIE的MSI中断处理机制与优化策略

PCIe设备的。

xiaoheshang_123的博客 521

YOLO环境配置+项目启动全流程(Conda+PyCharm超详解)

YOLO(You Only Look Once)是一个基于深度学习的目标检测算法,广泛应用于智能识别领域。本篇保姆级教学将手把手教你如何从零开始运行一个YOLO项目,适合完全没有基础的新手。

一键难忘的博客 1541

操作系统:进程间通信 | 管道

进程间通信(Inter-Process Communication,简称IPC)是指在不同进程之间传播或交换信息我们知道:进程之间是独立的,所以进程之间的进程间通信一定不是两个进程直接通信的,为了保证进程间的独立性和实现进程间通信,操作系统就设计了若干种进程间通信方式,来实现多进程之间的协同工作。

weixin_73234157的博客 1960

鱼鹰优化算法(OOA)详解:从猛禽捕食智能到优化算法实现

鱼鹰优化算法(Osprey Optimization Algorithm, OOA)是2023年提出的一种新型元启发式优化算法,灵感来源于鱼鹰(一种中型猛禽)高效的捕食策略。算法模拟了鱼鹰从空中识别水下鱼类位置并俯冲捕食,然后将捕获的鱼带至安全位置享用的全过程,以此抽象出全局探索和局部开发两个核心阶段。OOA算法具有参数少、结构简单、收敛速度快、全局寻优能力强等特点。自提出以来,已在函数优化、机器学习参数调优(如CatBoost模型)、路径规划等多个领域展现出良好性能,为解决复杂优化问题提供了新的有效工具。

qq_42212808的博客 273

python 进程间通信和进程池之间通信

“”" 进程间的通信 Queue 多进程之间,默认是不共享数据的通过队列将queue对象当成参数传入进程创建,可以实现进程间的数据传递 初始化Queue() 对象时,q = Queue() 若括号中没有指定最大消息数量,或数量为负 表示没有上限 Queue.qsize() 返回当前队列包含的消息数量 Queue.empty() 如果队列为空 返回True 反之False Queue.full() ...

Chujianlong321的博客 701

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Python 笔记(17)— 多进程实现(面向对象和面向过程)、守护进程、进程间通信、进程池、进程池之间通信、多进程生产消费模型

1 面向过程启动多进程 Python 操作进程的类都定义在 multiprocessing 模块,该模块提供了一个 Process 类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情。 import time import multiprocessing def test1(): while True: print("--1--") time.sleep(1) def test2(): while True:

wohu1104的专栏 1974

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第三部分进阶6-多进程multiprocessing|进程池Pool|队列Queue

第一部分 进程: ##################################### 1.**多进程** ##################################### ·程序: 是一个指令的集合 ·进程: 正在执行的程序;或者说:当你运行一个程序,你就启动了一个进程     - 编写完的代码,没有运行时,称为程序,正在运行的代码,称为进程     - 程序是死的(静态的),进程是活的(动态的) ·操作系统轮流让各个任务交替执

qq_36849630的博客 465

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

linux——进程间通信——管道

进程间通信(InterProcess Communication,IPC)是指在不同进程之间传播或交换信息。

qq_63943454的博客 878

进程、线程、进程池、进程三态、同步、异步、并发、并行、串行

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 5.5 分钟。来自:https://cnblogs.com/songhaixing/p/13799827.html一进...

良月柒 523

Phaser3微信小游戏适配:渲染器重构与性能优化实战

Phaser3作为主流HTML5游戏框架,其WebGL/Canvas渲染机制依赖标准浏览器API,而微信小游戏运行于封闭WebView环境,不支持document.createElement('canvas')、requestAnimationFrame及原生WebGL,必须重构底层渲染链路。核心在于用wx.createCanvas和离屏Canvas替代原生canvas上下文,通过双缓冲+ImageData直绘规避canvasToTempFilePath性能瓶颈,并同步适配输入事件映射与音频桥接。该方案不仅

weixin_34354945的博客 366

第八天 线程池和进程池

from queue import Queue as T_Queue # 线程队列 from multiprocessing import Process, Queue as P_Queue # 进程队列 1. 线程间通信 同一个进程中的多个线程,数据可以直接共享 数据收集:定义全局容器,常用的容器 - 线程队列 (定义全局队列直接使用) 添加数据: 队列.put(数据) 获取数据: 队列.get() 、 队列.get(timeout=时间) 2. 进程间通信 只能通过进程队列来进行数据交流

weixin_63123211的博客 386

多线程多进程服务器与进程线程池

1.进程池(1)进程池是由服务器预先创建的一组子进程,这些子进程的数目在3-10个之间。进程池中的所有子进程都运行着相同的代码,并具有相同的属性,比如优先级,PGID等等。因为进程池在服务器启动之初就创建好了,所以他们没有打开不必要的文件描述符(从父进程继承而来),也不会错误地使用大块的堆内存(从父进程复制得到)。(2) 当有新的任务到来时,主进程将通过某种方式选择进程池中的某一个子进程来为之服务。

sinat_123 543

进程

1.进程的定义 进程是资源分配最小单位 当一个可执行程序被系统执行(分配内存等资源)就变成了一个进程 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,这种执行的程序就称之为进程 程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念 在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行。 进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多道编程而提出的。 进程之间有

orange_tt的博客 905

进程,线程,以及Python的多进程实例

什么是进程,什么是线程? 进程与线程是包含关系,进程包含了线程。 进程是系统资源分配的最小单元,线程是系统任务执行的最小单元。 打个比方,打开word,word这个程序是一个进程,里面的拼写检查,字数统计,更改字体等等功能是一个个线程。当word这个进程启动的时候,系统分配给word进程一些资源(CPU,内存等),当某个线程执行时需要资源时,就从word进程的资源池里取。 关于P...

agn7047的博客 149

Linux进程间通信—管道

Linux进程通信——管道(匿名管道和命名管道)

m0_61986874的博客 517

Python之进程

一:什么是进程    当代码编译完成,在没有运行时称之为程序。正在运行着的代码,称之为进程。二:进程的创建    1:fork    2:  multiprocessing   三:Fork     fork 为unix环境下创建子进程,封装在OS模块中。    例1:fork()创建子进程   代码讲解:当程序运行至os.fork()会创建出一个子进程,然后复制父进程的所有信息到子进程中,即父进...

weixin_40230682的博客 715

【Python】利用 Python 实现多任务进程

来源:公众号【杰哥的IT之旅】作者:阿拉斯加ID:Jake_Internet一、进程介绍 进程:正在执行的程序,由程序、数据和进程控制块组成,是正在执行的程序,程序的一次执行过程,是资源调...

fengdu78的博客 451
上一篇: Python中的进程
下一篇: Python线程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值