Python之进程池、阻塞模式、非阻塞模式、进程间的通信、queue

非阻塞模式

# 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程
# 但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法.
# 初始化Poo1时,可以指定一个最大进程数,当有新的请求提交到Poo1中时,如果池还没有满,
# 那么就会创建一个新的进程用来执行该请求,但如果池中的进程数已经达到指定的最大值,那么 该请求就会等待
# 直到池中有进程结束,才会创建新的进程来执行。
#阻塞式:添加一个执行一个,然后接着添加下一个
#非阻塞式,全部添加到队列,立刻返回,并不会等待他们执行完毕,但是回调函数是等待任务执行完毕后才调用
import os
import time
from multiprocessing import Pool
from random import random
def task(task_name):print("开始做任务",task_name)#记录开始时间start = time.time()#模拟做任务time.sleep(random()*2)end = time.time()return "完成任务用时",(end-start),'进程id',os.getpid()'''
回调函数,当我们任务做完了,我们想把这个事情通知一下,我们把通知给扔出去了,扔给了回调函数
'''
container = []
def callback_func(n):container.append(n)if __name__ == '__main__':#Pool()需要传递参数,整型的参数pool = Pool(5)tasks = ['听音乐','吃饭','洗衣服','打游戏','散步','看孩子','做饭']#模拟循环创建8个任务for i in tasks:#下面函数表示用的是池子的非阻塞模式,需要传递函数,然后函数需要参数,需要可迭代的参数#循环一次池子添加一个任务#要使用进程池,要挡住你的主进程,因为进程或者要依靠主进程#callback需要传递的参数就是你的回调函数#回调函数就是当你的任务完成时,将任务完成的结果返回给回调函数,也就是test1的返回值成了callback_func的参数#之后可以在最后产生结果pool.apply_async(task,args=(i,),callback=callback_func)pool.close() #添加任务结束pool.join()#相当于插队,不让你的主进程往下走for c in container:print(c)

 结果

阻塞模式

#阻塞式
#进程的优点没有体现出来,不可以并行
#添加一个任务执行一个任务,如果一个任务不结束,另外一个让你无就进不来
#进程池:
#pool = Pool(max) 创建进程池对象
# pool.apply()阻塞
# pool.apply_async()非阻塞
# pool.close()
# pool.join()让主进程给子进程让路
import os
import time
from multiprocessing import Pool
from random import random
def task(task_name):print("开始做任务",task_name)#记录开始时间start = time.time()#模拟做任务time.sleep(random()*2)end = time.time()print("完成任务用时", (end - start), '进程id', os.getpid())
# container = []
# def callback_func(n):
#     container.append(n)
if __name__ == '__main__':pool = Pool(5)pool = Pool(5)tasks = ['听音乐', '吃饭', '洗衣服', '打游戏', '散步', '看孩子', '做饭']for i in tasks:pool.apply(task, args=(i,))pool.close()pool.join()

结果

 

queue

# 当进程平行执行时,数据如何从一个地方传输到另外一个地方,这个时候就需要用到队列了
# 队列就相当于在两个进程中搭个梯子,然后传输数据,queue
from multiprocessing import Queue
# queue需要的参数,通过put往Queue放东西
#规定队列里面的东西不超过5个
#put参数有个timeout,这个参数就是当有个东西等待相应的时间若还是没有空出来,就会报异常
q=Queue(5)
q.put('a')
q.put('b')
q.put('c')
q.put('d')
q.put('e')
print(q.qsize())
if not q.full(): #full用来判断队列是否满了 q.empty()判断队列是不是空的q.put('f',timeout=4) #如果你的队列满了,则你现在只能等,除非队列里面空出一个位置
else:print("队列已满")#取出队列的值,同样这个也有个timeout参数,这个就是当你取东西的时间超过了对应时间,就会报异常
#这个异常可以用try去掉
print(q.get())
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))

结果

 进程间通信

借助queue

# 白大黑
# 开发时间:$[DATE] $[TIME]
from multiprocessing import Process,Queue
from time import sleepdef download(q):#模拟图片images=['a.jpg','b.jpg','c.jpg']#模拟下载图片for i in  images:print('正在下载',i)sleep(0.5)q.put(i)#下载成功后需要把文件送到getfile中,然后getfile拿到这个文件,就把这个文件放到一个具体的位置
#但是现在是两个进程,两个进程是平行的。如何把下载的东西上传到getfile中就是一个问题
#这时queue就出现了
#两者通信当然要保持两者通道是一致的,queue当然使用的是一个
#所以需要两个函数都弄一个参数q,然后使用args参数传进去
def getfile(q):while True:try:file = q.get(timeout=2)print('{}文件保存成功'.format(file))except:print('保存完毕')breakif __name__ == '__main__':q=Queue(5)#当download执行完成后,他就会把剩下的内存回收,这时getfile就不能用了,所以下载的东西可能不完全#所以就需要p1这个任务等待一下p1 = Process(target=download,args=(q,))p2 = Process(target=getfile,args=(q,))p1.start()#放了join就相当于p1插队了p1.join()p2.start()

结果

 进程对于全局变量的访问

import os
from multiprocessing import Process
from time import sleep
#当你的子进程调用全局变量的时候,相当于每个子进程会拥有一个自己的m变量,意思是两个子进程的变量m是分开的
#m是不可变类型,可变类型也是同理,这样就实现了多任务
m = 1
def test1(x):global mwhile True:sleep(x)m = m+1print("这是任务1",'子',os.getpid(),'父',os.getppid(),m)def test2(a):global mwhile True:sleep(a)m = m + 1#os.getpid进程号os.getppid父进程号print('这是任务2','子',os.getpid(),'父',os.getppid(),m)
if __name__ == '__main__':#创建进程,这是两个子进程,当你运行程序的时候python解释器就已经默认给你分配了一个进程,然后这个程序里面有创建了两个子进程#若是需要传参数,Process有别的属性args这个后面需要跟一个可迭代的,这个里面的就是你给函数传的参数#p.run只启动任务不执行进程,p.start启动进程并执行任务.p.terminate终止进程p = Process(target=test1,name='任务1',args=(1,))p.start()print(p.name)p1 = Process(target=test2,name="任务2",args=(2,))p1.start()print(p1.name)

 结果

m是每个进程单独的一个


不嫌弃的点点关注,点点赞 ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/279774.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员下班以后做什么副业合适?

我就是一个最普通的网络安全工程师,出道快10年了,不出意外地遭遇到瓶颈期,但是凭技术在各大平台挖漏洞副业,硬是妥妥扛过来了。 因为对于程序员来讲,这是个试错成本很低、事半功倍的选择。编程技能是一种强大生产力&a…

Flutter-底部弹出框(Widget层级)

需求 支持底部弹出对话框。支持手势滑动关闭。支持在widget中嵌入引用。支持底部弹出框弹出后不影响其他操作。支持弹出框中内容固定头部和下面列表时,支持触摸头部并在列表不在头部的时候支持滑动关闭 简述 通过上面的需求可知,就是在界面中可以支持…

行业回暖?这个行业岗位需求飙升6倍!程序员们提前恭喜了!

前言 随着今年史上最长春节假期正式收官,各行各业相继进入开工节奏,就业市场开启持续升温模式。 今年开工首周,人才需求增长明显,求职者活跃度大大增多,就业市场进入了繁忙有序的节奏,呈现出春招市场的勃…

CI/CD实战-git工具使用 1

版本控制系统 本地版本控制系统 集中化的版本控制系统 分布式版本控制系统 git官网文档:https://git-scm.com/book/zh/v2 Git 有三种状态:已提交(committed)、已修改(modified) 和 已暂存(sta…

查找众数及中位数 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 众数是指一组数据中出现次数量多的那个数,众数可以是多个。 中位数只是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那…

harmonyOS简介及背景

harmonyOS的场景模式18n: 1(入口手机)8(电脑、VR、手环、iPad、智慧屏、)–wifi—n(车载、智能家居等所有)harmonyOS不需要考虑软硬件的差异,是一个兼容N种的超级终端harmonyOS干了两件事: (1&a…

没有经验就开通抖店,你会遇到以下这些问题!2024抖店教程(新版)

我是王路飞。 没有经验的人去做抖店的话,都会遇到哪些问题呢? 大概率逃脱不开这些问题: 店铺的类型怎么选? 店铺的流量从哪来? 没有货源但又担心做无货源模式会被平台判定违规; 怎么才能快速把店铺做…

pytorch 入门基础知识二(Pytorch 02)

一 微积分 1.1 导数和微分 微分就是求导: %matplotlib inline import numpy as np from matplotlib_inline import backend_inline from d2l import torch as d2l def f(x):return 3 * x ** 2 - 4 * x 定义: 然后求 f(x) 在 x 1 时的导数&#xff…

深入理解Ubuntu22:探索Linux操作系统的功能与应用

一、linux (一)、安装 1、电脑可以安装双系统,即在一套硬件上只能同时运行一个操作系统,例:C盘安装win,D盘安装linux。 2、虚拟机 虚拟机需要硬件支持,并需开启VT-x. 如:Virtual…

PLM系统实施的六大难点及其解决方法

实施PLM系统是企业实现产品全生命周期管理的重要举措,但在实施过程中往往会面临一些难点。本文将探讨实施PLM系统的主要难点及其解决方法。 首先,数据迁移和整合是实施PLM系统的一个关键挑战。企业可能拥有大量的现有数据,包括设计文件、工艺…

幼儿教育管理系统|基于jsp 技术+ Mysql+Java的幼儿教育管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java,ssm,springboot的平台设计与实现项目系统开发资源(可…

HANA VIEW 用 ABAP 创建CDS VIEW,在生成ODATA

这里我们做ADT来创建 场景介绍:把hana中的一个底表,创建成ABAP的 CDS VIEW ,在把CDS VIEW 生成 OData 服务。 一、创建CDS Table Function 红框内根据自身情况填写 选择 Define Table Function with Parameters 创建 Data Definition 完整代码,定义 结构 , 也可以定义参…

力扣Lc18--- 168. Excel表列名称(java版)-2024年3月19日

1.题目描述 2.知识点 因为是输入字符 然后显示数字。 就类似2进制10代表2&#xff0c;110代表4&#xff0c;用某进制次幂的方式返回最后的数字结果。 3.代码实现 class Solution {public int titleToNumber(String columnTitle) {int sum0;for(int i0;i<columnTitle.len…

python网络爬虫实战教学——urllib的使用(1)

文章目录 专栏导读1、前言2、urllib的使用3、发送请求3.1 urlopen3.2 request 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对…

C#对ListBox控件中的数据进行的操作

目录 1.添加数据&#xff1a; 2.删除数据&#xff1a; 3.清空数据&#xff1a; 4.选择项&#xff1a; 5.排序&#xff1a; 6.获取选中的项&#xff1a; 7.获取ListBox中的所有项&#xff1a; 8.综合示例 C#中对ListBox控件中的数据进行的操作主要包括添加、删除、清空、…

关于小仙炖燕窝的崛起!

产品策略 爆火逻辑 1. 超级品类&#xff1a;对传统的升级 干燕窝&#xff1a;选&#xff1f;炖&#xff1f;吃&#xff1f; &#xff08;口感差&#xff09;即食燕窝&#xff1a;新鲜&#xff1f;营养&#xff1f;&#xff08;营养保障&#xff09;鲜炖燕窝&#xff1a;保质期、…

【鸿蒙HarmonyOS开发笔记】应用数据持久化之通过关系型数据库实现数据持久化

概述 关系型数据库&#xff08;Relational Database&#xff0c;RDB&#xff09;是一种基于关系模型来管理数据的数据库。关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制&#xff0c;对外提供了一系列的增、删、改、查等接口&#xff0c;也可以直接运…

18个惊艳的可视化大屏(第28辑):房产楼盘领域

在房产楼盘领域&#xff0c;可视化的大屏可以提供以下九大价值&#xff1a; 展示楼盘信息 可视化的大屏可以用于展示楼盘的基本信息&#xff0c;包括楼盘名称、位置、户型、价格、面积等&#xff0c;帮助潜在客户快速了解楼盘的特点和优势。 展示楼盘效果图 通过大屏展示楼盘…

load函数无法正常加载CUDA扩展的问题(程序在某一行突然卡死,也不报错,也不停止运行就可以考虑这个原因)

背景&#xff1a;在服务器上跑代码的时候&#xff0c;有时候会遇到程序在某一行代码卡死(阻塞)&#xff0c;既不报错&#xff0c;也不停止运行&#xff0c;就堵在那里。 此时就可以考虑是代码在哪里碰到了load函数&#xff0c;load函数无法正常加载CUDA扩展的问题。 下面以碰到…

MFC界面美化第三篇----自绘按钮(重绘按钮)

1.前言 最近发现读者对我的mfc美化的专栏比较感兴趣&#xff0c;因此在这里进行续写&#xff0c;这里我会计划写几个连续的篇章&#xff0c;包括对MFC按钮的美化&#xff0c;菜单栏的美化&#xff0c;标题栏的美化&#xff0c;list列表的美化&#xff0c;直到最后形成一个完整…