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…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
