python 进程之由浅入深

news/2024/4/28 12:16:05/文章来源:https://blog.csdn.net/love_521_/article/details/137084496

进程测试

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 进程名)但是父进程 没有去处理这些残留信息 导致残留信息占用系统内存僵尸进程时有害的当出现大量的僵尸进程时 会占用系统资源 可以把它父进程杀掉  僵尸就成了孤儿 操作系统会负责回收数据

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

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

相关文章

UE RPC 外网联机(1)

技术&#xff1a;RPC TCP通信 设计&#xff1a;大厅服务<---TCP--->房间服务<---RPC--->客户端&#xff08;Creator / Participator&#xff09; 1. PlayerController 用于RPC通信控制 2.GameMode 用于数据同步 3.类图 4. 注意 &#xff08;1&#xff09;RPC&a…

机器学习之决策树现成的模型使用

目录 须知 DecisionTreeClassifier sklearn.tree.plot_tree cost_complexity_pruning_path(X_train, y_train) CART分类树算法 基尼指数 分类树的构建思想 对于离散的数据 对于连续值 剪枝策略 剪枝是什么 剪枝的分类 预剪枝 后剪枝 后剪枝策略体现之威斯康辛州乳…

GIMP - GNU 图像处理程序 - 工具栏窗口 (Toolbox)

GIMP - GNU 图像处理程序 - 工具栏窗口 [Toolbox] 1. GNU Image Manipulation Program2. Windows -> Recently Closed Docks -> ToolboxReferences 1. GNU Image Manipulation Program 2. Windows -> Recently Closed Docks -> Toolbox References [1] Yongqiang …

软件概要设计说明书word原件(实际项目)

一、 引言 &#xff08;一&#xff09; 编写目的 &#xff08;二&#xff09; 范围 &#xff08;三&#xff09; 文档约定 &#xff08;四&#xff09; 术语 二、 项目概要 &#xff08;一&#xff09; 建设背景 &#xff08;二&#xff09; 建设目标 &#xff08;三&a…

Typora字数过多的时候造成卡顿现象如何解决?

Typora字数过多的时候造成卡顿现象如何解决&#xff1f; 点击 、切换、滚动、打字都有点卡顿&#xff0c;下面介绍三种方法&#xff0c;三种方法都可以尝试&#xff0c;建议先尝试方法一&#xff0c;效果不满意就用方法二&#xff0c;实在不行就最后一个取巧的办法。 方法1&a…

图像处理与视觉感知---期末复习重点(5)

文章目录 一、膨胀与腐蚀1.1 膨胀1.2 腐蚀 二、开操作与闭操作 一、膨胀与腐蚀 1.1 膨胀 1. 集合 A A A 被集合 B B B 膨胀&#xff0c;定义式如下。其中集合 B B B 也称为结构元素&#xff1b; ( B ^ ) z (\hat{B})z (B^)z 表示 B B B 的反射平移 z z z 后得到的新集合。…

《Vision mamba》论文笔记

原文出处&#xff1a; [2401.09417] Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model (arxiv.org) 原文笔记&#xff1a; What&#xff1a; Vision Mamba: Efficient Visual Representation Learning with Bidirectional St…

llama-index 结合chatglm3-6B 利用RAG 基于文档智能问答

简介 llamaindex结合chatglm3使用 import os import torch from llama_index.core import VectorStoreIndex, ServiceContext from llama_index.core.callbacks import CallbackManager from llama_index.core.llms.callbacks import llm_completion_callback from llama_ind…

Groovy基础入门

一、Groovy简介 Groovy是运行在JVM中的一种动态语言&#xff0c;可以在Java平台上进行编程&#xff0c;使用方式基本与使用Java代码的方式相同&#xff0c;它的语法与Java语言的语法很相似&#xff0c;与Java相比&#xff0c;Groovy更加灵活、简洁&#xff0c;而且完成同样的功…

C语言例4-6:格式字符d的使用例子

代码如下&#xff1a; //格式字符d的使用例子 #include<stdio.h> int main(void) {int num1123;long num2123456;printf("num1%d,num1%5d,num1%-5d,num1%2d\n",num1,num1,num1,num1);//以四种不同格式&#xff0c;输出int型数据num1的值printf("num2%ld,…

Mybatis别名 动态sql语句 分页查询

给Mybatis的实体类起别名 给Mybatis的xml文件注册mapper映射文件 动态sql语句 1 if 2 choose 3 where 4 foreach 一&#xff09;if 查询指定名称商品信息 语法&#xff1a; SELECT * FROM goods where 11 <if test "gName!null"> and g.g_name like co…

linux:线程同步

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言线程同步条件变量接口简单示例pthread_cond_wait为什么要有mutex伪唤醒问题的解决 (if->while) 总结 前言 本文作为我对于线程同步知识总结 线程同步 同步&…

admin端

一、创建项目 1.1 技术栈 1.2 vite 项目初始化 npm init vitelatest vue3-element-admin --template vue-ts 1.3 src 路径别名配置 Vite 配置 配置 vite.config.ts // https://vitejs.dev/config/import { UserConfig, ConfigEnv, loadEnv, defineConfig } from vite im…

步态采集平台

&#x1f349;步骤一、读取视频每一帧图像 &#x1f349;步骤二、对读取的图像进行分割&#xff0c;得到全景下的步态轮廓图。 ​​​​​​​&#x1f349;步骤三、对读取的图像进行裁剪得到归一化的步态轮廓图。 ​​​​​​​&#x1f349;步骤四、保存这一帧步态轮廓图

【Web应用技术基础】CSS(5)——表格样式

第一题&#xff1a;表格边框 .html <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>HTML – 简单表格</title><link rel"stylesheet" href"step1/CSS/style.css"></head><bod…

用 AI 编程-释放ChatGPT的力量

最近读了本书&#xff0c;是 Sean A Williams 写的&#xff0c;感觉上还是相当不错的。一本薄薄的英文书&#xff0c;还真是写的相当好。如果你想看&#xff0c;还找不到&#xff0c;可以考虑私信我吧。 ChatGPT for Coders Unlock the Power of AI with ChatGPT: A Comprehens…

html音频和视频可输入表单input

音频和视频 loop循环播放autoplay自动播放controls显示控制面板<audio src""> //<video src"#">muted静音播放 可输入表单input password密码框 radio单选框 checkbox复选框 file上传文件 text文本框 文本框<input type"text"…

Mysql数据库-DQL查询

Mysql数据库-DQL基本查询 1 DQL基本查询1.1 基础查询1.2 WHERE子句1&#xff09;算术运算符2&#xff09;逻辑运算符3&#xff09;比较运算符A&#xff09;BETWEEN... AND ...B&#xff09;IN(列表)C&#xff09;NULL值判断 4&#xff09;综合练习 2 DQL高级查询2.1 LIKE 模糊查…

Spring用到了哪些设计模式?

目录 Spring 框架中⽤到了哪些设计模式&#xff1f;工厂模式单例模式1.饿汉式&#xff0c;线程安全2.懒汉式&#xff0c;线程不安全3.懒汉式&#xff0c;线程安全4.双重检查锁&#xff08;DCL&#xff0c; 即 double-checked locking&#xff09;5.静态内部类6.枚举单例 代理模…

语音陪玩交友软件系统程序-app小程序H5三端源码交付,支持二开!

电竞行业的发展带动其周边产业的发展&#xff0c;绘制着游戏人物图画的抱枕、鼠标垫、海报销量极大&#xff0c;电竞游戏直播、游戏教程短视频也备受人们喜爱&#xff0c;自然&#xff0c;像游戏陪练、代练行业也随之生长起来&#xff0c;本文就来讲讲&#xff0c;从软件开发角…