Python进程、多进程、线程以及同步和死锁

一 传统编程的缺陷

传统编程的弊端:

# 必须按照顺序执行,多个任务无法同时在还行
import timedef sing():for i in range(5):print("sing: hero")time.sleep(1)       # 每唱一次,等1秒再唱def dance():for i in range(5):print("dance: swan")time.sleep(1)       # 每唱一次,等1秒再跳def main():sing()dance()if __name__ == "__main__":main()

2个任务花费的时间是10秒,如果要边跳边唱,其实2个任务是可以在最长的那个任务完成时全部完成的。

实现多任务编程的方式有很多,如:多进程、多线程、协程等。

二 使用多进程方式实现多任务

# 必须按照顺序执行,多个任务无法同时在还行
import time
import multiprocessingdef sing():for i in range(5):print("sing: hero")time.sleep(1)       # 每唱一次,等1秒再唱def dance():for i in range(5):print("dance: swan")time.sleep(1)       # 每唱一次,等1秒再跳def main():p1 = multiprocessing.Process(target=sing)p2 = multiprocessing.Process(target=dance)p1.start()p2.start()if __name__ == "__main__":main()

三 进程的一些操作

通过 htop 命令可以查看详细的进程列表。

注意:使用kill -9 pid 杀死主进程后,子进程不会被杀死,此时命令行也会无法正常退出,因为该命令的信号是发给了主进程来执行杀死任务,子进程由于没有父进程,变成了孤儿进程,之后被init进程领养。也就是说杀死主进程后,子进程的父进程称为了init进程。

通过 os.getpid() 可以获取到当前进程的pid,os.getppid()可以获取父进程id。

四 进程间通信

进程之间无法直接进行通信,因为他们是互相独立的应用程序。

进程之间要实现通信,常见的方式有:socket等,python中可以使用队列方式实现:

queue = multiprocessing.Queue(3)
queue.put("111")
queue.put(222)# 取数据
res = queue.get()
print(res)
# 判断: q.full()  q.empty()

五 进程池

p = multiprocessing.Pool(3)

六 多线程方式实现多任务

import time
import threadingdef sing():for i in range(5):print("sing: hero")time.sleep(1)       # 每唱一次,等1秒再唱def dance():for i in range(5):print("dance: swan")time.sleep(1)       # 每唱一次,等1秒再跳def main():t1 = threading.Thread(target=sing)      # 创建一个线程对象t2 = threading.Thread(target=dance)     # 创建一个线程对象t1.start()                              # 开启线程t2.start()                              # 开启线程if __name__ == "__main__":main()

七 线程相关API

通过 threading.Thread() 可以创建线程,threading.enumerate() 也可以查看当前所有的线程:

import time
import threadingdef sing():for i in range(5):print("sing: hero")time.sleep(1)       # 每唱一次,等1秒再唱def dance():for i in range(5):print("dance: swan")time.sleep(1)       # 每唱一次,等1秒再跳def main():t1 = threading.Thread(target=sing)t2 = threading.Thread(target=dance)t1.start()t2.start()while True:length = len(threading.enumerate())print("当前线程数为:%d" % length)if length <= 1:breaktime.sleep(0.5)if __name__ == "__main__":main()

八 同步与死锁

线程是共享全局变量的,这样就会造成数据的混乱:

import time
import threading# 定义共享的全局变量
num = 0def add100():global numfor i in range(100000):num = num + 0.00001def add1000():global numfor i in range(100000):num = num + 1000def main():t1 = threading.Thread(target=add100)t2 = threading.Thread(target=add1000)t1.start()t2.start()time.sleep(5)print(num)              # 每次输出的结果是不相同的if __name__ == "__main__":main()

使用互斥锁实现同步的方案:

import time
import threading# 定义共享的全局变量
num = 0def add100():global nummutex.acquire()     # 加锁:若已经加锁,则会直到锁被揭开for i in range(100000):num = num + 0.00001mutex.release()     # 解锁def add1000():global nummutex.acquire()     # 加锁:若已经加锁,则会直到锁被揭开for i in range(100000):num = num + 1000mutex.release()     # 解锁# 创建互斥锁,默认不会上锁
mutex = threading.Lock()def main():t1 = threading.Thread(target=add100)t2 = threading.Thread(target=add1000)t1.start()t2.start()time.sleep(5)print(num)          # 100000001.0 永远不会变if __name__ == "__main__":main()

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

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

相关文章

AI时代下的智能商品计划如何助力服装企业实现库存精准优化

在AI时代&#xff0c;智能商品计划为服装企业实现库存精准优化提供了强大的支持。以下是AI在这方面的关键作用和助力手段&#xff1a; 1. 数据驱动的需求预测&#xff1a; AI利用大数据和机器学习技术&#xff0c;分析历史销售数据、市场趋势、季节性变化等多方面信息&#x…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -我参与的投票列表实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

给高中生的一些建议

背景 总分300&#xff0c;各科60分左右 基本原理 破罐子破摔&#xff0c;集中力量办大事 分析 破罐子破摔 从高一到现在高二上学期的成绩来看&#xff0c;如果继续保持目前这种状态&#xff0c;到高考也是稳在300左右。即&#xff0c;如果不改变&#xff0c;就是咸鱼一条。既…

响应式编程WebFlux基础实战练习

什么是WebFlux&#xff1f; 响应式编程WebFlux是Spring Framework 5中引入的一个全新的响应式编程框架&#xff0c;它基于Reactor库构建&#xff0c;提供了异步和非阻塞的事件处理。WebFlux框架设计用于处理长时间运行的异步任务&#xff0c;例如网络调用或数据库操作&#xf…

打破硬件壁垒:TVM 助力 AI技术跨平台部署

文章目录 《TVM编译器原理与实践》编辑推荐内容简介作者简介目录前言/序言获取方式 随着人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;在全世界信息产业中的广泛应用&#xff0c;深度学习模型已经成为推动AI技术革命的关键。TensorFlow、PyTorch、MX…

【习题】应用程序框架

判断题 1. 一个应用只能有一个UIAbility。错误(False) 正确(True)错误(False) 2. 创建的Empty Ability模板工程&#xff0c;初始会生成一个UIAbility文件。正确(True) 正确(True)错误(False) 3. 每调用一次router.pushUrl()方法&#xff0c;页面路由栈数量均会加1。错误(Fal…

FPGA难学在哪里,要如何学习?

难易程度&#xff0c;取决于你的专业背景 1、相关专业&#xff1a;如果你在本科学习期间&#xff0c;学习过数字电路、或者就是电子相关专业的同学。对数字电路和逻辑设计有一定基础的话&#xff0c;入门FPGA可能相对容易一些。 2、非相关专业&#xff1a;学习FPGA可能会有一定…

计算机图形学作业:三阶贝塞尔曲面

题目要求 编写程序&#xff0c;设计一个三阶的 Bezier 曲面&#xff0c;在给定控制点的情况下&#xff0c;计算出 Bezier 曲面上的点&#xff08;设 u&#xff0c;v 方向的曲面精度可通过参数设置&#xff09;&#xff0c;然后将这些点保存到数组中。如果该 Bezier 曲面以三角…

【精选】 dockerFile 使用简介 (超详细)

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步…

开放式耳机品牌排行榜,2024开放式耳机选购攻略

我在选后开放式耳机的路上可以说是花了不少米&#xff0c;前前后后也下了不少的功夫去做功课了解开放式耳机&#xff0c;包括市面上目前最火的西圣、南卡、cleer等热门型号我都有用过了&#xff0c;可以说是很有发言权了吧。 开放式耳机现在越来越涌现在大众的视野上了&#x…

如何构建Prompt,帮我生成QA,作为召回率检索的测试集?

最近在做搜索召回率的提升工作。粮草未动兵马先行&#xff01;在做之前应该先有一把尺子来衡量召回率的好坏。所以应该先构建测试数据集&#xff0c;然后去做标准化测试。 有了测试机集以后。再去做搜索优化&#xff0c;才能看出来效果。 当然可以选择一些开源的测试集。如果可…

POI:对Excel的基本读操作 整理2

1 简单读取操作 public class ExcelRead {String PATH "D:\\Idea-projects\\POI\\POI_projects";// 读取的一系列方法// ...... } 因为07版本和03版本操作流程大差不差&#xff0c;所以这边就以03版本为例 Testpublic void testRead03() throws IOException {//获取…

ctypes实现numpy和OpenCV Mat之间的数据交互

1、目的 将c/c编译成动态链接库&#xff0c;通过python调用&#xff0c;实现常见变量比如int&#xff0c;字符串之间的交互&#xff0c;以及np.ndarray和cv::Mat间的交互. 更简单的方式参考&#xff1a;pybind11实现numpy和OpenCV Mat的数据交互-CSDN博客 2 步骤 新建CMakeL…

运用AI搭建中间服务层(三)

CognitiveServices文件夹 在这个文件夹中&#xff0c;我们需要添加以下文件&#xff1a; IVisionService.cs 视觉服务 .cs 视觉结果.cs IEntitySearchService.cs 实体搜索服务.cs 实体结果.cs 帮助程序.cs IVisionService.cs - 访问影像服务的接口定义&#xff0c;需要…

可拖拽表单比传统表单好在哪里?

随着行业的进步和发展&#xff0c;可拖拽表单的应用价值越来越高&#xff0c;在推动企业实现流程化办公和数字化转型的过程中发挥了重要价值和作用&#xff0c;是提质增效的办公利器&#xff0c;也是众多行业客户朋友理想的合作伙伴。那么&#xff0c;可拖拽表单的优势特点表单…

【MySQL】聚合函数与分组查询

聚合函数与分组查询 一、聚合函数1、常见的聚合函数2、实例 二、分组查询1、group by子句2、准备工作3、实例4、having 条件 一、聚合函数 说明&#xff1a;聚合函数用来计算一组数据的集合并返回单个值&#xff0c;通常用这些函数完成&#xff1a;个数的统计&#xff0c;某列…

Dubbo 框架揭秘:分布式架构的精髓与魔法【一】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Dubbo 框架揭秘&#xff1a;分布式架构的精髓与魔法【一】 前言Dubbo是什么Dubbo的核心概念整体设计 前言 在数字时代&#xff0c;分布式架构正成为应对大规模流量和复杂业务场景的标配。Dubbo&#…

vue项目使用typescript创建抽象类及其使用

如题&#xff0c;可以在vue项目使用typescript创建抽象类&#xff0c;然后使用这个抽象类。 通过TypeScript&#xff0c;可以在前端应用抽象类了。抽象类的好处&#xff0c;可以同时满足继承和多态&#xff0c;好处多多。以vue3为例&#xff1a; 1、创建抽象类 据说js类中&a…

监督学习 - XGBoost(eXtreme Gradient Boosting)

什么是机器学习 XGBoost&#xff08;eXtreme Gradient Boosting&#xff09;是一种梯度提升树算法&#xff0c;它在梯度提升框架的基础上引入了一些创新性的特性&#xff0c;以提高模型性能和训练速度。XGBoost在解决结构化数据的分类和回归问题上表现出色&#xff0c;成为许多…

Unity-游戏与帧

游戏的本质就是一个死循环 “游戏的本质就是一个死循环”这句话&#xff0c;其实是指游戏引擎的主循环。游戏引擎是游戏开发中最核心的部分&#xff0c;它负责处理玩家的输入、更新游戏状态、渲染画面等工作&#xff0c;而这些工作都是在一个不断重复的循环中完成的。 具体来…