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/588301.shtml

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

相关文章

【网络基础】网络基础知识(学习笔记)

一、局域网的组成 交换机&#xff1a;组建局域网的设备(内网)路由器&#xff1a;连接内外网的设备 二、ip地址 ip地址&#xff1a;设备的唯一标识&#xff0c;32位二进制网络编码点分十进制&#xff1a;x.x.x.x 范围&#xff1a;0-255 三、子网掩码 局域网的同一网段才可以…

Python+Selenium定位到多个相同的元素取指定的那一个

在使用新版的Selenium对网页代码中存在相同class name属性的元素进行定位&#xff0c;在定位的过程中发现使用先前的定位方法已经无法成功对所要操作组件进行定位&#xff0c; 一、老版本元素定位方法&#xff1a; find_elements_by_id() find_elements_by_name() find_eleme…

07|输出解析:用OutputParser生成鲜花推荐列表

07&#xff5c;输出解析&#xff1a;用OutputParser生成鲜花推荐列表 模型 I/O Pipeline 下面先来看看 LangChain 中的输出解析器究竟是什么&#xff0c;有哪些种类。 LangChain 中的输出解析器 语言模型输出的是文本&#xff0c;这是给人类阅读的。但很多时候&#xff0c;你…

livox avia平台搭建

硬件平台搭建 硬件平台的搭建除了livox雷达外还需要以下物料 焊接12V稳压模块接口 livox雷达需要12V的稳定电压供电,因此需要在电池与雷达之间加入8-35V转12V的稳压模块 组装 将各组建组装起来即可。 220V交流电供电 电池供电

谷歌Linux内核自动测试平台架构介绍-用自动测试测试难以测试的问题

1 摘要 内核和硬件等低级系统已被证明极难进行有效测试&#xff0c;因此&#xff0c;许多内核测试都是以手动为主方式进行的。现有的大多数测试框架都是为测试与底层平台隔离的高级软件而设计的&#xff0c;而底层平台被假定是稳定可靠的。测试底层平台本身需要一套全新的假设…

研究:同样的C++模板在多个cpp里出现,编译器是否要重复生成?

2023年就要过去&#xff0c;马上要跨如2024年。祝大家在新的一年&#xff0c;有个好收成。 一直以来不是很确定&#xff1a; 同样的的模板&#xff0c;在各个cpp分别出现&#xff0c;编译器要实现几份&#xff1f; 研究一下。 用命令行的编译方法&#xff0c;参考&#xff1a…

使用react+vite开发项目时候,部署上线后刷新页面无法访问解决办法

说一下我这边的环境和使用的路由模式&#xff1a;vitereactBrowserRouter路由模式&#xff0c;所以如果你和我一样的话&#xff0c;可以试试我的这种解决办法&#xff0c;我是将项目打包后直接丢到服务器上的目录里面&#xff0c;然后配置nginx直接访问根目录。 我的nginx配置…

[蓝桥杯 2021模拟题] 时间加法

时间加法 题目描述 现在时间是 a 点 b 分&#xff0c;请问 t 分钟后&#xff0c;是几点几分&#xff1f; 输入描述 输入的第一行包含一个整数 a。 第二行包含一个整数 b。 第三行包含一个整数 t。 其中&#xff0c;0≤a≤23,0≤b≤59,0≤t,t 分钟后还是在当天。 输出描…

Java 类型转换

自动 1 短的变长的 2 表达式的自动类型转换 多种数据类型参与运算&#xff0c;其结果以大的数据类型为准byte, short, char 三种类型数据在和其他类型数据运算时&#xff0c;都会转换为int类型再运算&#xff08;byte byte也会是int int&#xff09; 强制 前面我们学习了自…

Python中matplotlib使用3

在matplotlib中&#xff0c;可以将数据用离散的点来表示&#xff0c;这种表示方式叫做散点图。 1 基本的散点图 可以使用matplotlib.pyplot库中的scatter()方法绘制散点图&#xff0c;代码如图1所示。 图1 绘制基本散点图的代码 从图1中可以看出&#xff0c;scatter()方法的…

【操作系统xv6】学习记录1

前置说明&#xff1a; git-v9版本&#xff1a;git clone https://github.com/mit-pdos/xv6-public/tree/xv6-rev9 bili:https://www.bilibili.com/video/BV15r4y1z75F 深圳大学罗秋明老师的课程 我自己用的wsl2的ubuntu18 无桌面版本 make qemu-nox bug 起初在双系统的ubuntu…

算法训练营Day32

122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxProfit(int[] prices) {int res0;for(int i 1;i<prices.length;i){if((prices[i]-prices[i-1])>0){resprices[i]-prices[i-1];}}return res;} } 55. 跳跃游戏 - 力扣…

【HR非技术问题面试篇】你怎么看待加班?

你对加班怎么看待? &#x1f60a;老油条经典回答系列 &#x1f60a;老油条经典回答系列 这种问题&#xff0c;怎么回答都可以&#xff0c;我觉得重要的实时表达你自己。如果你就不想加班&#xff0c;也没必要勉强说自己爱加班&#xff0c;结果入职之后干的不开心。 不过&…

限制哪些IP能连接postgre

打开C:\Program Files\PostgreSQL\9.4\data\pg_hba.conf 以下代表本机能连&#xff0c;172.16.73.xx都能连&#xff08;/24就代表最后一位是0-255&#xff09;&#xff0c;如果是172.16.73.11/32那就是限制了172.16.73.11才能连&#xff08;实际我设置/32是无效的&#xff09;&…

大数据应用领域:数据驱动一切

大数据出现的时间只有十几年&#xff0c;被人们广泛接受并应用只有几年的时间&#xff0c;但就是这短短几年的时间&#xff0c;大数据呈现出爆炸式增长的态势。在各个领域&#xff0c;大数据的身影几乎无处不在。今天我们通过一些大数据典型的应用场景分析&#xff0c;一起来看…

使用webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

在我们使用 Selenium 进行 UI 自动化测试时&#xff0c;常常会因为浏览器驱动与浏览器版本不匹配&#xff0c;而导致自动化测试无法执行&#xff0c;需要手动去下载对应的驱动版本&#xff0c;并替换原有的驱动&#xff0c;可能还会遇到跨操作系统进行测试的时候&#xff0c;以…

linux go环境安装 swag

下载依赖包 go get -u github.com/swaggo/swag编译 移动到下载的go-swagger包目录,一般在$GOPATH/pkg/mod下 查看 GOPATH echo $GOPATHcd /root/GolangProjects/pkg/mod/github.com/swaggo/swagv1.16.2go install ./cmd/swag/不出意外&#xff0c;$GOPATH/bin下 已经有了sw…

【VRTK】【VR开发】【Unity】17-创建立体UI

【背景】 游戏无法忽略的一个要素就是UI界面,本篇开始介绍VRTK这方面的能力。 VR游戏的UI和传统电视游戏UI的不同之处在于,VR游戏的UI必须融合在VR的游戏空间内,而传统电视游戏的UI则可以位于游戏画面的上层,位于屏幕的特定位置,比如表示人物血量等的图示等。不同于传统的…

对比学习简介

1. 引言 在本教程中&#xff0c;我们将介绍对比学习领域中的相关概念。首先&#xff0c;我们将讨论这种技术背后相关的理论知识&#xff1b;接着&#xff0c;我们将介绍最常见的对比学习的损失函数和常见的训练策略。 闲话少说&#xff0c;我们直接开始吧&#xff01; 2. 举…

45、激活函数 - 为什么非线性这么重要

这一节开始讲一讲神经网络中的激活函数,在讲激活函数之前,先讲一下非线性。 看一个基础知识:线性函数的叠加,我们初中学过的知识点。 假设有一个线性函数,y = kx + b, 这个函数画出来是下面的样子,这里显示 y 和 x 是线性关系。 而如果这个时候又有一个线性关系 z = hy…