python 进程之由浅入深
进程测试
import osimport time
while True:time.sleep(0.5)print("hahaha")print("self", os.getpid()) #获取自己的进程idprint("parent",os.getppid()) #parent 获取父进程的id
互斥锁
# """
# 当多个进程共享一个数据时,可能会造成数据错乱
# 1.使用join 来让这些进程 串行 但是这将造成 无法并发 并且 进程执行任务的顺序就固定了
# 2.使用锁 将需要共享的数据加锁 其他进程在访问数据时 就必须等待当前进程使用完毕
#
# 锁的本质 就是一个bool类型的数据 在执行代码前 会先判断 这个值
# 注意 在使用锁时 必须保证锁是同一个
#
# 互斥锁
# 互相排斥的锁
#
# """
#
from multiprocessing import Process,Lockimport random
import timedef task1(lock):lock.acquire() # 是一个阻塞的函数 会等到别的进程释放锁才能继续执行lock.acquire()print("1my name is:bgon")time.sleep(random.randint(1,2))print("1my age is:78")time.sleep(random.randint(1, 2))print("1my sex is:femal")lock.release()def task2(lock):lock.acquire()print("2my name is:blex")time.sleep(random.randint(1, 2))print("2my age is:68")time.sleep(random.randint(1, 2))print("2my sex is:femal")lock.release()def task3(lock):pass
# 锁的实现原理 伪代码
# l = False
# def task3(lock):
# global l
# if l == False:
# l = True
# print("3my name is:常威")
# time.sleep(random.randint(1, 2))
# print("3my age is:68")
# time.sleep(random.randint(1, 2))
# print("3my sex is:femal")
# l = Falseif __name__ == '__main__':lock = Lock()p1 = Process(target=task1,args=(lock,))p1.start()# p1.join()p2 = Process(target=task2,args=(lock,))p2.start()# p2.join()p3 = Process(target=task3,args=(lock,))p3.start()# p3.join()
#
# # 多个任务在共享一个数据时
# # 串行效率低 但是不会出问题
# # 并发效率高 但是数据可能错乱
#
#
## from multiprocessing import Lock,RLock,Process
#
# lock = Lock()
#
# lock.acquire()
# print("haha ")
# lock.acquire()
# print('test')
# lock.release()# RLock 表示可重入锁 特点是 可以多次执行acquire
# Rlock 在执行多次acquire时 和普通Lock没有任何区别
# 如果在多进程中使用Rlock 并且一个进程a 执行了多次acquire
# 其他进程b要想获得这个锁 需要进程a 把锁解开 并且锁了几次就要解几次
# 普通锁如果多次执行acquire将会锁死#
# lock = RLock()
# lock.acquire()
# lock.acquire()
# print("哈哈")
# lock.release()# import time
# def task(i,lock):
# lock.acquire()
# lock.acquire()
# print(i)
# time.sleep(3)
# lock.release()
# lock.release()
# #第一个过来 睡一秒 第二个过来了 睡一秒 第一个打印1 第二个打印2
#
# if __name__ == '__main__':
# lock = RLock()
# p1 = Process(target=task,args=(1,lock))
# p1.start()
#
# p2 = Process(target=task, args=(2,lock))
# p2.start()
开启进程的两种方式
from multiprocessing import Process
import os#
def task(name):print(name)print("self",os.getpid())#66039print("parent", os.getppid())#66038print("task run")# windows创建子进程时 子进程会将父进程的代码加载一遍 导致重复创建子进程
# 所以一定要将 创建子进程的代码放到main的下面
if __name__ == '__main__':print("self", os.getpid()) #66038print("parent", os.getppid()) #36520p = Process(target=task, name="这是子进程!",kwargs={"name":"bgon"}) # 创建一个表示进程的对象 但并不是真正的创建进程p.start() # 给操作系统发送通知 要求操作系统开启进程# 创建进程的第二种方式 继承Process 覆盖run方法
# 在子进程启动以后会自动执行run方法
# 其优势是 可以自定义 进程的属性和行为 来完成一些额外任务 例如下载
# class MyProcess(Process):
#
# def __init__(self,url):
# self.url = url
# super().__init__()
#
# # 子类中的方法 只有run会被自动执行
# def run(self):
# print("下载文件...." , self.url)
# print(" run run run!")
#
# def task(self):
# pass
#
# def task():
# print(123)# if __name__ == '__main__':
# p = MyProcess("www.baidu.com/xx.mp4")
# p.start()
进程间内存相互独立
from multiprocessing import Processimport time
a = 1000000000000def task():global aprint(id(a))a = 0print("子进程的",a)if __name__ == '__main__':print(id(a))p = Process(target=task)p.start() # 给操作系统发送请求后 代码继续往下运行 至于子进程 什么时候创建 什么是执行 都跟当前进程没关系time.sleep(1)print("自己的",a)# 子进程中的数据修改 不会影响父进程
互斥锁的使用场景_抢票
import json
from multiprocessing import Process,Lock
import time
import random"""
join和锁的区别
1.join中顺序是固定的 不公平
2.join是完全串行 而 锁可以使部分代码串行 其他代码还是并发 """# 查看剩余票数
def check_ticket(usr):time.sleep(random.randint(1,3))with open("ticket.json","r",encoding="utf-8") as f:dic = json.loads(f.read())print("%s查看 剩余票数:%s" % (usr,dic.get('count')))def buy_ticket(usr):with open("ticket.json","r",encoding="utf-8") as f:dic = json.load(f)if dic.get('count')> 0:time.sleep(random.randint(1,3))dic["count"] -= 1with open("ticket.json", "w", encoding="utf-8") as f2:json.dump(dic,f2)print("%s 购票成功!" % usr)else:print('剩余票:',dic.get('count'))print('Not Found of tiket!')def task(usr,lock):check_ticket(usr)# time.sleep(1)lock.acquire()buy_ticket(usr)lock.release()if __name__ == '__main__':lock = Lock()for i in range(10):p = Process(target=task,args=("用户%s" % i,lock))p.start()#p.join() # 只有第一个整个必须完毕 别人才能买 这是不公平的
父进程等待子进程结束
import time
from multiprocessing import Process# def task():
# print("上传文件....")
# time.sleep(3)
# print("上传结束...")
#
#
# # [进程1,进程2,进程3]
#
# if __name__ == '__main__':
# p = Process(target=task)
# p.start()
#
# p.join() # 本质上 是提高了子进程优先级 当CPU在切换时 会优先切子进程
#
# print("上传文件成功!")def task(num):print("我是%s号 进程" % num)# time.sleep(1)print("=========")if __name__ == '__main__':start_time = time.time()ps = []for i in range(1,4):p = Process(target=task,args=(i,))p.start()print("----{}".format(i))# ps.append(p)for p in ps:p.join()print(time.time()-start_time)print("over")
process 常用属性
from multiprocessing import Processimport timedef task():# time.sleep(3)print("执行完毕!")if __name__ == '__main__':p = Process(target=task, name="alex")p.start()print(p.name)## # time.sleep(1)# print(p.is_alive())# #p.terminate()# #print(p.is_alive())# # print(p.pid)# p.terminate() # 终止这个进程# print(p.pid)# print(p.is_alive())# p.daemon # 守护进程
死锁
"""死锁 指的是 锁 无法打开了 导致程序死卡首先要明确 一把锁 时不会锁死的正常开发时 一把锁足够使用 不要开多把锁"""from multiprocessing import Process,Lock
import time
def task1(l1,l2,i):l1.acquire()print("盘子被%s抢走了" % i)time.sleep(1)l2.acquire()print("筷子被%s抢走了" % i)print("吃饭..")l1.release()l2.release()passdef task2(l1,l2,i):l2.acquire()print("筷子被%s抢走了" % i)l1.acquire()print("盘子被%s抢走了" % i)print("吃饭..")l1.release()l2.release()if __name__ == '__main__':l1 = Lock()l2 = Lock()Process(target=task1,args=(l1,l2,1)).start()Process(target=task2,args=(l1,l2,2)).start()
IPC 进程间通讯
"""IPC 进程间通讯由于进程之间内存是相互独立的 所以需要对应积极而方案 能够使得进程之间可以相互传递数据1.使用共享文件,多个进程同时读写同一个文件IO速度慢,传输数据大小不受限制2.管道 是基于内存的,速度快,但是是单向的 用起来麻烦(了解)3.申请共享内存空间,多个进程可以共享这个内存区域(重点)速度快但是 数据量不能太大
"""from multiprocessing import Manager,Process
#
# def task(m):
#
# print(m["num"])
#
# if __name__ == '__main__':
# # 开启了一个Manager
# with Manager() as m:
# m["num"] = 100 # 在这个空间中存储了一个num
#
# for i in range(20):
# p = Process(target=task,args=(m,))
# p.start()
#
#from multiprocessing import Manager,Process,Lock
def work(d):# with lock:d['count']-=1if __name__ == '__main__':with Manager() as m:dic=m.dict({'count':100}) #创建一个共享的字典p_l=[]for i in range(100):p=Process(target=work,args=(dic,))p_l.append(p)p.start()for p in p_l:p.join()print(dic)
僵尸进程
import time
from multiprocessing import Process
def task1():print("子进程 run")if __name__ == '__main__':for i in range(10):p = Process(target=task1)p.start()time.sleep(100000)
队列
"""队列 不只用于进程间通讯也是一种常见的数据容器其特点是:先进先出其优点是:可以保证数据不会错乱 即使在多进程下 因为其put和get默认都是阻塞的对比堆栈刚好相反 :后进先出#"""from multiprocessing import Queue# q = Queue(1) # 创建一个队列 最多可以存一个数据
#
# q.put("张三")
# print(q.get())
#
# q.put("李四") # put默认会阻塞 当容器中已经装满了
#
# print(q.get())
# print(q.get()) # get默认会阻塞 当容器中已经没有数据了
#
# print("over")q = Queue(1) # 创建一个队列 最多可以存一个数据
#
q.put("张三")
# q.put("李四",False) # 第二个参数 设置为False表示不会阻塞 无论容器是满了 都会强行塞 如果满了就抛异常print(q.get())
print(q.get(timeout=3)) # timeout 仅用于阻塞时# q.put("李四") # put默认会阻塞 当容器中已经装满了
#
# print(q.get())
# print(q.get()) # get默认会阻塞 当容器中已经没有数据了
#
# print("over")
生产者消费者模型
"""什么是生产者 消费者 模型生产者 产生数据的一方消费者 处理数据的一方例如需要做一个爬虫1.爬取数据2.解析数据爬去和解析都是耗时操作,如果正常按照顺序来编写代码,将造成解析需要等待爬去 爬去取也需要等待解析这样效率是很低的要提高效率 就是一个原则 让生产者和消费解开耦合 自己干自己的如何实现:1.将两个任务分别分配给不同进程2.提供一个进程共享的数据容器"""
import random
from multiprocessing import Process,Queue
import time
# 爬数据
def get_data(q):for num in range(5):print("正在爬取第%s个数据" % num)time.sleep(random.randint(1,2))print("第%s个数据 爬取完成" % num)# 把数据装到队列中q.put("第%s个数据" % num)def parse_data(q):for num in range(5):# 取出数据data = q.get()print("正在解析%s" % data)time.sleep(random.randint(1, 2))print("%s 解析完成" % data)if __name__ == '__main__':# 共享数据容器q = Queue(5)#生产者进程produce = Process(target=get_data,args=(q,))produce.start()#消费者进程customer = Process(target=parse_data,args=(q,))customer.start()
总结
1. 并发编程让你的程序可以同时处理多个任务2.并发的基石是 多道技术空间复用: 同一时间 内存存储了多个应用程序不同应用程序之间的内存是相互独立的时间复用: 当一个程序遇到了IO操作时 会切换到其他应用程序 ,以此来提高CPU的利用率多道技术的缺点: 当应用程序都是计算任务时 切换反而降低效率 (但是必须得切 才能保证多任务并发)3.并发 与 并行并发 多个事件 同时发生, 也称之为伪并行并行 多个事件 同时进行,阻塞和非阻塞 指的是程序的状态就绪 运行 阻塞4.两种使用进程的方式1.直接创建Process对象 指定target参数2.继承Process 覆盖run方法5.join函数提高优先级 使 父进程等待子进程结束6.孤儿进程与僵尸进程路径了解孤儿进程 是指 父进程已经终止了 但是自己还在运行 是无害的孤儿进程会自定过继给操作系统僵尸进程 是指 子进程执行完成所有任务 已经终止了但是 还残留一些信息(进程id 进程名)但是父进程 没有去处理这些残留信息 导致残留信息占用系统内存僵尸进程时有害的当出现大量的僵尸进程时 会占用系统资源 可以把它父进程杀掉 僵尸就成了孤儿 操作系统会负责回收数据
相关文章:
python 进程之由浅入深
进程测试 import osimport time while True:time.sleep(0.5)print("hahaha")print("self", os.getpid()) #获取自己的进程idprint("parent",os.getppid()) #parent 获取父进程的id互斥锁 # """ # 当多个进程共享一个数据时…...

公链角逐中突围,Solana 何以成为 Web3 世界的流量焦点?
在众多区块链公链中,Solana 凭借其创纪录的处理速度和极低的交易费用,成为了众多开发者和投资者的宠儿。就像网络上流行的那句话所说:“Why slow, when you can Solana?”,Solana 正以它的速度和强大的生态系统,重新定…...
算法设计-杨辉三角
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 杨辉三角形又称Pascal三角形,它的第i1行是(ab)i的展开式的系数。 它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。 下面给出了杨辉三角形的…...
Linux swatch命令教程:实时监视系统活动(附实例详解和注意事项)
Linux swatch命令介绍 swatch(Simple Watcher)是一个简单的监视器,设计用于监视系统活动。为了使swatch有用,它需要一个配置文件,该文件包含要查找的模式和找到每个模式时要执行的操作。 Linux swatch命令适用的Linu…...

C/C++语言学习路线: 嵌入式开发、底层软件、操作系统方向(持续更新)
初级:用好手上的锤子 1 【感性】认识 C 系编程语言开发调试过程 1.1 视频教程点到为止 1.2 炫技视频看看就行 1.3 编程游戏不玩也罢 有些游戏的主题任务就是编程,游戏和实际应用环境有一定差异(工具、操作流程),在…...

SAP-CO主数据之统计指标创建-<KK01>
公告:周一至周五每日一更,周六日存稿,请您点“关注”和“在看”,后续推送的时候不至于看不到每日更新内容,感谢。 目录 一、背景: 成本中心主数据创建:传送门 成本要素主数据创建࿱…...

Eclipse+Java+Swing实现斗地主游戏
一. 视频演示效果 java斗地主源码演示 二.项目结构 代码十分简洁,只有简单的7个类,实现了人机对战 素材为若干的gif图片 三.项目实现 启动类为Main类,继承之JFrame,JFrame 是 Java Swing 库中的一个类,用于创建窗…...
postgres12.4安装pg_rman-1.3.16
操作系统版本:centos7.6 X64 pg_rman版本:pg_rman-1.3.16-pg12.tar.gz postgres版本:postgresql-12.4.tar.gz 备份文件存放路径:/home/postgres/backup 归档日志存放路径:/home/postgres/archivelog/ postgres用户的环…...

Word邮件合并
Word邮件合并功能可以解决在Word中批量填写内容的需求,当需要大量格式相同,只修改少数相关内容时,例如利用Word制作工资条,通知函,奖状等等,同时操作也非常简单灵活。下面通过例子来说明邮件合并的使用方法…...

git的安装与配置教程-超详细版
一、git的安装 1、下载git git官网地址:https://git-scm.com/download/win/ 选择所需要的版本,进行下载。 2、下载完成之后,双击下载好的exe文件进行安装。 3、默认是C盘,推荐修改一下路径(非中文并且没有空格&…...

李宏毅【生成式AI导论 2024】第5讲 让语言模型彼此合作,把一个人活成一个团队
GPD4,它也有非常强大的能力。但是GPT4如果跟其他的语言模型合作,他们其实可以发挥1加1大于二的力量。 为什么要让模型合作? 那怎么让模型彼此合作呢?有很多不同的方式。一个可能性是假设你现在手边就有一堆语言模型,他们可能有不同的能力使用,他们可能有不同的成本局来…...

Unity 实现鼠标左键进行射击
发射脚本实现思路 分析 确定用户交互方式:通过鼠标左键点击发射子弹。确定子弹发射逻辑:每次点击后有一定时间间隔才能再次发射。确定子弹发射源和方向:子弹从枪口(Transform)位置发射,沿枪口方向前进。 变…...

数据库---PDO
以pikachu数据库为例,数据库名: pikachu 1.连接数据库 <?php $dsn mysql:hostlocalhost; port3306; dbnamepikachu; // 这里的空格比较敏感 $username root; $password root; try { $pdo new PDO($dsn, $username, $password); var_dump($pdo)…...
asyncio和 aiohttp
文章目录 asyncio和 aiohttp3.8版本 特性aiohttp案例优化方案 asyncio和 aiohttp asyncio即Asynchronous I/O是python一个用来处理并发(concurrent)事件的包,是很多python异步架构的基础,多用于处理高并发网络请求方面的问题。 为了简化并更好地标识异…...

微服务demo(三)nacosfeign
一、feign使用 1、集成方法 1.1、pom consumer添加依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.6.RELEASE</version></dependency&…...

学浪视频如何录屏保存?
学浪软件对录屏进行了防范,不管什么录屏软件只要打开学浪就会黑屏,这里就教大家一个方法,可以使用网页版进行录屏 这里是学浪的网页版地址 https://student-api.iyincaishijiao.com/ep/pc/login 但是你们打开这个地址会直接跳转到这个页面…...
c++中2种返回变量类型名称的方法
std::string real_name abi::__cxa_demangle(typeid(*(*a)).name(), NULL, NULL, &status);必须使用#include <typeinfo> std::string real_name boost::core::demangle(typeid(*(*a)).name());必须使用 #include <boost/core/demangle.hpp> #include <t…...

python仿真报告自动化——excite TD齿轮角加速度级计算
python仿真报告自动化——excite TD齿轮角加速度级计算 1 、问题-燃油泵相位优化2、难点-excite TD结果文件的提取3、代码 1 、问题-燃油泵相位优化 用excite TD对齿轮系进行仿真,模拟不同燃油泵相位对齿轮传动振动的影响,用齿轮角加速度级作为评价指标…...
如何系统的学习 C#
第一阶段:环境搭建与基础知识 1.1 安装开发环境 下载并安装Visual Studio或Visual Studio Code。若选用Visual Studio Code,记得安装C#扩展插件。 1.2 C#语言概述 了解C#的发展历程、特点以及应用场景。学习C#的基本语法规范,例如语句结尾…...
python爬虫----python列表高级
小伙伴们,大家好!今天学习的内容是python列表高级。 1、添加元素 append:在列表末尾添加元素 A [xiaoWang, xiaoZhang, xiaoHua] print("添加之前,列表A的数据:", A)temp input(请输入要添加的学生姓名:) A.append…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...

C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

Tauri2学习笔记
教程地址:https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引:https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多,我按照Tauri1的教程来学习&…...