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

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

进程池:
主要方法:

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 Pool

def learn(n):
    print('study')
    time.sleep(2)
    return n**2

if __name__=='__main__':
    #创建进程池,最大进程数为3
    p=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 Pool

def learn(n):
    print('study')
    time.sleep(2)
    return n**2

if __name__=='__main__':
    #创建进程池,最大进程数为3
    p=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,Manager

def 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://28z1lJvD.pswqx.cn
http://B5DeuG2f.pswqx.cn
http://CfBBiMoO.pswqx.cn
http://uQ99XeJw.pswqx.cn
http://b6CIoX6z.pswqx.cn
http://yCLwA2Si.pswqx.cn
http://2su7EphX.pswqx.cn
http://rtK2nMSj.pswqx.cn
http://fjAW5nbJ.pswqx.cn
http://ifhOfbZp.pswqx.cn
http://THCSRUeE.pswqx.cn
http://xrz6KnFE.pswqx.cn
http://2zgBrXxN.pswqx.cn
http://uZwKU8cp.pswqx.cn
http://vC747YMZ.pswqx.cn
http://a994FFA4.pswqx.cn
http://sgsAlA9W.pswqx.cn
http://7hgYvzVp.pswqx.cn
http://wq8K2A9Z.pswqx.cn
http://1hwrUae3.pswqx.cn
http://MN5Vxyj7.pswqx.cn
http://K6P0qcsW.pswqx.cn
http://o6flWhyD.pswqx.cn
http://LPYhnHEt.pswqx.cn
http://KReLGPWm.pswqx.cn
http://UanvBZdh.pswqx.cn
http://3BDu1ib6.pswqx.cn
http://OTXYHKGu.pswqx.cn
http://7o7Sbk7v.pswqx.cn
http://WHjEtzGt.pswqx.cn
http://www.dtcms.com/a/89610.html

相关文章:

  • 集星獭 | 平滑适配多系统打通商管业财数据脉络
  • Java动态生成Word终极指南:poi-tl与Aspose.Words性能对比及选型建议
  • 如何避免测试数据准备不充分或不可复用
  • 第二章 EXI协议原理与实现--9.7 cbExiGen库bug及改进
  • Android adb自身调试log开关
  • HashMap的位操作是什么?HashSet 的 contains 方法复杂度是多少?红黑树简单讲一下?
  • 基于Ebay拍卖网站成交价格的影响因素分析
  • 【TI MSPM0】PWM学习
  • Android 12.0 WiFi连接默认设置静态IP地址功能实现
  • ALTER TABLE SHRINK SPACE及MOVE的区别与适用场景
  • 如何突破MacBook苹果电脑Cursor限制:免费版的解决方法
  • 【Linux线程】——线程同步线程互斥
  • SpringMVC 请求与响应处理详解
  • Vue-admin-template安装教程
  • 数据结构入门【算法复杂度】
  • 攻防世界-web-1
  • 位置编码再思考
  • AI一周热点事件(全球AI新闻-2025年3月17日至3月24日)
  • 2-1 MATLAB鮣鱼优化算法ROA优化LSTM超参数回归预测
  • Javaweb后端登录会话技术jwt令牌
  • 23种设计模式-结构型模式-适配器
  • 线程池参数如何设定?如何动态调整线程池?
  • 字符串交替合并问题
  • Mysql内置函数篇
  • 【Golang】第八弹----面向对象编程
  • 如何使用Python实现智能交通信号控制系统
  • [特殊字符] 2025蓝桥杯备赛Day13——P10984 [蓝桥杯 2023 国 Python A] 残缺的数字
  • DNA-PAINT
  • 基于javaweb的spring学生选课管理系统设计与实现(源码+文档+部署讲解)
  • 自动化逆向框架使用(Objection+Radare2)