Python:进程池,同步和异步,进程池通信示例

server/2025/3/30 18:13:26/

进程池:
主要方法:

p.apply_async(func(函数名)[,args(传递给func的参数列表--元组形式)[,kwds(传递给func的关键字参数列表)]])        非阻塞方式调用func

p.close()  关闭进程池,防止进一步操作(进程池不接受新的任务)

p.join() 阻塞进程

enumerate() 不管任务是否完成,立即终止,如果使用异步提交任务,等进程池内任务都处理完,需要用get()来收集结果

使用场景:利用Python进行系统管理的时候,同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量时间

阻塞:遇到I/O就发生阻塞,程序一旦阻塞操作就停在原地,并且立刻释放CPU资源

非阻塞:没有遇到I/O操作或者通过某种手段让程序即使遇到IO操作也不会停在原地而去执行其他操作,力求尽可能多的占有CPU资源

同步与异步:提交任务的两种方式:
同步调用:提交完任务后就在原地等待,直到任务运行完毕后,拿到任务的返回值,才能继续执行下一行的代码

异步调用:提交完任务后,不在原地等待,直接执行下一行代码

进程池同步和异步操作:

#异步:不用等待当前进程执行完毕,随时根据系统调度来进行进程切换
import os
import time
from multiprocessing import Pooldef learn(n):print('study')time.sleep(2)return n**2if __name__=='__main__':#创建进程池,最大进程数为3p=Pool(3)list=[]for i in range(6):result=p.apply_async(learn,args=(i,))#learn函数名,i为函数learn的参数list.append(result)#把结果添加到list列表里p.close()#关闭进程池,关闭后p不再接受新的请求p.join()#等待p中所有的子程序执行完成,必须放在close语句之后for j in list:print(j.get())#使用get获取apply_async
#同步:apply(同步阻塞)需要等待当前子进程执行完毕后,在执行下一个进程(按顺序执行)
import os
import time
from multiprocessing import Pooldef learn(n):print('study')time.sleep(2)return n**2if __name__=='__main__':#创建进程池,最大进程数为3p=Pool(3)list=[]for i in range(6):result=p.apply(learn,args=(i,))#learn函数名,i为函数learn的参数list.append(result)#把结果添加到list列表里print(list)

进程池的通信:

Pool创建进程池,需要使用multiprocessing.Manager()中Queue()

if multiprocessing.Queue()

Manager()模块专门用来做数据共享,支持很多类型,如value,array,list,dict,Queue,Lock等

multiprocessing模块下的Queue为进程提供服务;

queue模块下的Queue为线程提供服务;

队列实例化 q=Manager(),Queue()

import os
from multiprocessing import Pool,Managerdef rd(q):print(f'rd启动{os.getpid()},父进程{os.getppid()}')for i in range(q.qsize()):#q.qsize()返回队列中数据的数量print('取出数据:',q.get())def wd(q):print(f'wd启动{os.getpid()},父进程{os.getppid()}')for i in '123':print('wd中的:',i)q.put(i)#把字符串123中的某个数据放到队列中if __name__=='__main__':print('begin,',os.getpid())q=Manager().Queue()#创建进程池p=Pool()#使用异步操作p.apply_async(wd,args=(q,))p.apply_async(rd,args=(q,))p.close()#关闭进程池p.join()#阻塞主进程print('end',os.getpid())

输出结果为:
begin, 524
wd启动7628,父进程524
wd中的: 1
wd中的: 2
wd中的: 3
rd启动10488,父进程524
取出数据: 1
取出数据: 2
取出数据: 3
end 524


http://www.ppmy.cn/server/179256.html

相关文章

目录遍历漏洞复现

1.在fofa中输入语法,查询目录遍历 body"SKControlKLForJson.ashx" 查询结果为: 2.寻找目录遍历漏洞,访问网站: 3.我们可以app目录中下载文件等等 4.我们还可以访问其他目录的一些东西

vivado 创建生成时钟

创建生成时钟 生成时钟源自另一个现有时钟 (主时钟)。通常用来描述由逻辑块在主时钟上执行的波形变换。由于生成时钟的定义 取决于主时钟特性,因此必须首先定义主时钟。要明确定义生成时钟,必须使用 create_generated_clock 命…

Linux 配置时间服务器

一、同步阿里云服务器时间 服务端设置 1.检查chrony服务是否安装,设置chrony开机自启,查看chrony服务状态 [rootnode1-server ~]# rpm -q chrony # rpm -q 用于查看包是否安装 chrony-4.3-1.el9.x86_64 [rootnode1-server ~]# systemctl enable --n…

可变形交互注意力模块(DIA-Module)及代码详解

模块定义 可变形交互注意力模块(DIA - Module)是一种创新的深度学习技术, 结合了可变形卷积和注意力机制 ,旨在提高特征提取的准确性和效率。该模块通过动态调整卷积核的采样位置,实现了对不同尺度和形状的特征的自适应捕捉,同时利用注意力机制增强了模型对关键特征的关…

K8S学习之基础四十九:dns只能解析短域名问题

之前遇到一个问题,kibana看不到es日志,通过后台查询发现解析不到es的完整主机名 通过dig测试发现只能解析短域名,无法解析全域名 通过排查发现pod中的/etc/resolv.conf中都有localdomain,大概路是这个问题引起,手工删…

如何用Kafka实现优先级队列

引言 在分布式系统中,消息队列是一种常见的异步通信机制,而优先级队列则是消息队列的一种特殊形式,它能够根据消息的优先级进行处理,确保高优先级的消息能够优先被消费。Apache Kafka作为一个高性能、高可靠性的分布式流处理平台…

新手村:逻辑回归-理解03:逻辑回归中的最大似然函数

新手村:逻辑回归-理解03:逻辑回归中的最大似然函数 1. 似然函数 假设我们有一个二分类问题,其中 N N N 个样本的数据集为 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } \{(x_1, y_1), (x_2, y_2), \ldots, (x_N, y_N)\} {(x1​…

【设计模式】组合模式

第11章 组合模式 11.1 一个基本的目录内容遍历范例 组合模式用于处理树形结构数据&#xff0c;如操作系统目录。以下是目录遍历的非组合模式实现&#xff1a; 文件类定义 class File { public:File(string name) : m_sname(name) {}void ShowName(string lvlstr) {cout <…