Python运维之多进程!!
本节的快速导航目录如下喔!!!
一、创建进程的类Process
二、进程并发控制之Semaphore
三、进程同步之Lock
四、进程同步之Event
五、进程优先队列Queue
六、多进程之进程池Pool
七、多进程之数据交换Pipe
一、创建进程的类Process
multiprocessing模块提供了一个创建进程的类Process,创建进程有两种方法:
- 创建一个类的实例Process,并指定任务目标函数
-
自定义一个类并继承Process类,重写其init()方法和run方法
第一种方法:
import osimport timefrom multiprocessing import Process# 字进程要执行的代码:数据累加耗时函数def task_process(delay):num = 0for i in range(delay * 10000000):num += iprint(f"进程pid为{os.getpid()},执行完成")if __name__ == '__main__':print('父进程pid为 %s.' % os.getpid())t0 = time.time()# 单进程执行task_process(3)task_process(3)t1 = time.time()print(f"顺序执行耗时{t1 - t0}")p0 = Process(target=task_process, args=(3,))p1 = Process(target=task_process, args=(4,))t2 = time.time()# 双进程并行执行p0.start();p1.start()p0.join();p1.join()t3 = time.time()print(f"多进程并发执行耗时{t3 - t2}")# 发现多进程执行相同的操作次数耗时更少
第二种方法(重写方法):
# -*- coding: UTF-8 -*-import osimport timefrom multiprocessing import Processclass MyProcess(Process):def __init__(self, delay):super().__init__()self.delay = delay# 子进程要执行代码def run(self):num = 0for i in range(self.delay * 10000000):num += iprint(f"进程pid为{os.getpid()},执行完成")if __name__ == '__main__':print('父进程pid为 %s.' % os.getpid())p0 = MyProcess(3)p1 = MyProcess(3)t0 = time.time()p0.start()p1.start()p0.join()p1.join()t1 = time.time()print(f"多进程并发执行耗时{t1 - t0}")
Process类的构造函数原型:
class multiprocessing.Process(group=None,target=None,name=None,args=(),kwargs={},*,daemon=None)'''参数说明如下:Target:表示调用对象,一般为函数,也可以为类。Args:表示调用对象的位置参数元组Kwargs:为进程调用对象的字典Name:为进程的别名Group:参数不使用,可忽略'''
类提供的常用方法如下:
- is_alive():返回进程是否是激活的
- join([timeout]):阻塞进程,直到进程执行完成或超时或进程被终止。
- run():代表进程执行的任务函数,可被重写
- start():激活进程
- terminate():终止进程
其属性如下:
- authkey:字节码,进程的准密钥
daemon
:父进程终止后自动终止,且不能产生新进程,必须在start()之前设置- exicode:退出码,进程在运行时为None,如果为-N,就表示被信号N结束
- name:获取进程名称
- pid:进程ID
例子:不设置daemon属性:
# -*- coding: UTF-8 -*-import osimport timefrom multiprocessing import Process# 子进程要执行的代码def task_process(delay):print(f"{time.strftime('%Y-%m-%d %H:%M:%S')} 子进程执行开始")print(f"sleep {delay}s")time.sleep(delay)print(f"{time.strftime('%Y-%m-%d %H:%M:%S')} 子进程执行结束")if __name__ == '__main__':print(f"{time.strftime('%Y-%m-%d %H:%M:%S')} 父进程执行开始")p0 = Process(target=task_process,args=(3,))p0.start()print(f"{time.strftime('%Y-%m-%d %H:%M:%S')} 父进程执行结束")'''2024-05-08 20:04:09 父进程执行开始2024-05-08 20:04:09 父进程执行结束2024-05-08 20:04:10 子进程执行开始sleep 3s2024-05-08 20:04:13 子进程执行结束'''
'''
没有使用p0.join()来阻塞进程,父进程并没有等待子进程运行完成就打印了退出信息,程序依旧会等待子进程运行完成
'''
例子:设置daemon
属性:
# 在上述代码主程序中添加p0.deamon = True'''2024-05-08 20:07:11 父进程执行开始2024-05-08 20:07:11 父进程执行结束'''# 程序并没有等待子进程结束而结束,主要主程序结束,程序即退出
二、进程并发控制之Semaphore
semaphore用来控制对共享资源的访问数量,可以控制同一时刻并发的进程数。
# 实例:多进程同步控制import multiprocessingimport timedef worker(s,i):s.acquire() print(time.strftime('%H:%M:%S'),multiprocessing.current_process().name+"获得锁运行");time.sleep(i)print(time.strftime('%H:%M:%S'), multiprocessing.current_process().name +"释放锁运行");s.release()if __name__ == '__main__':s = multiprocessing.Semaphore(2) # 同一时刻只有两个进程在执行for i in range(6):p = multiprocessing.Process(target=worker(s,2))p.start()
三、进程同步之Lock
多进程的目的是并发执行,提高资源利用率,从而提高效率,但有时候我们需要在某一时间只能有一个进程访问某个共享资源,这种情况就需要使用锁Lock
# 多个进程输出信息,不加锁:import multiprocessingimport timedef task1():n = 5while n > 1:print(f"{time.strftime('%H:%M:%S')}task1 输出信息")time.sleep(1)n -= 1def task2():n = 5while n > 1:print(f"{time.strftime('%H:%M:%S')}task2 输出信息")time.sleep(1)n -= 1def task3():n = 5while n > 1:print(f"{time.strftime('%H:%M:%S')}task3 输出信息")time.sleep(1)n -= 1if __name__ == '__main__':p1 = multiprocessing.Process(target=task1)p2 = multiprocessing.Process(target=task2)p3 = multiprocessing.Process(target=task3)p1.start();p2.start();p3.start()
未使用锁,生成三个子进程,每个进程都打印自己的信息。下面使用锁:
import multiprocessingimport timedef task1(lock):with lock: # 也可使用上下文关键字加锁n = 5while n > 1:print(f"{time.strftime('%H:%M:%S')}task1 输出信息")time.sleep(1)n -= 1def task2(lock):lock.acquire()n = 5while n > 1:print(f"{time.strftime('%H:%M:%S')}task2 输出信息")time.sleep(1)n -= 1lock.release()def task3(lock):lock.acquire() # 调用前后加锁n = 5while n > 1:print(f"{time.strftime('%H:%M:%S')}task3 输出信息")time.sleep(1)n -= 1lock.release()if __name__ == '__main__':lock = multiprocessing.Lock() # 1、实例化一个锁p1 = multiprocessing.Process(target=task1,args=(lock,))p2 = multiprocessing.Process(target=task2,args=(lock,))p3 = multiprocessing.Process(target=task3,args=(lock,))p1.start()p2.start()p3.start()
可以发现,同一时刻只有一个进程在输出信息。
四、进程同步之Event
Event用来实现进程之间同步通信
import multiprocessing
import timedef with_for_event(e):e.wait()time.sleep(1)# 唤醒后清除Event状态,为后续继续等待e.clear()print(f"{time.strftime('%H:%M:%S')}:进程A:我们是兄弟,我等你...")e.wait()print(f"{time.strftime('%H:%M:%S')}:进程A:好的,是兄弟一起走")def wait_for_event_timeout(e, t):e.wait()time.sleep(1)e.clear()print(f"{time.strftime('%H:%M:%S')}:进程B:好吧,最多等你{t}秒")e.wait(t)print(f"{time.strftime('%H:%M:%S')}:进程B:我要继续往前走了")if __name__ == '__main__':e = multiprocessing.Event()w1 = multiprocessing.Process(target=with_for_event,args=(e,))w2 = multiprocessing.Process(target=wait_for_event_timeout,args=(e,5))w1.start()w2.start()# 主进程发话print(f"{time.strftime('%H:%M:%S')}:主进程:谁等我下,我需要8秒时间")# 唤醒等待的进程e.set()time.sleep(8)print(f"{time.strftime('%H:%M:%S')}:好的,我赶上了")# 再次唤醒等待的进程e.set()w1.join()w2.join()print(f"{time.strftime('%H:%M:%S')}:主进程:退出")
上述定义了两个函数,一个用于等待事件的发生;一个用于等待事件发生并设置超时时间。主进程调用事件的set()方法唤醒等待事件的进程,事件唤醒后调用claer()方法清除事件的状态并重新等待,以此达到进程同步的控制。
五、进程优先队列Queue
- 多进程安全:Queue是为多进程环境设计的,确保在多进程之间进行数据传递时的安全性。
- put方法:
- 用于向队列中插入数据。
- 有两个可选参数:blocked 和 timeout 。
- 默认情况下,
blocked
设置为True
。 - 如果
timeout
是一个正值,并且队列已满,put
方法会阻塞直到队列有空间或者超时。 - 超时会抛出
Queue.Full
异常。 - 如果
blocked
设置为False
且队列已满,会立即抛出Queue.Full
异常。
- get方法:
- 用于从队列中读取并删除一个元素。
- 同样有两个可选参数:
blocked
和timeout
。 - 默认情况下,
blocked
设置为True
。 - 如果
timeout
是一个正值,并且在指定时间内队列中没有元素可取,会抛出Queue.Empty
异常。 - 如果block设置为False则有两种情况:
- 如果队列为空,会立即抛出
Queue.Empty
异常。 - 如果队列中有值可用,会立即返回该值。
- 如果队列为空,会立即抛出
这些特性确保了在多进程环境中,队列操作的同步性和数据的一致性。
# 实现消费者-生产者模式
from multiprocessing import Process,Queue
import timedef ProducerA(q):count = 1while True:q.put(f"冷饮 {count}")print(f"{time.strftime('%H:%M:%S')} A 放入:[冷饮 {count}]")count +=1time.sleep(1)def ConsumerB(q):while True:print(f"{time.strftime('%H:%M:%S')} B 放入:[取出 {q.get()}]")time.sleep(5)if __name__ == '__main__':q = Queue(maxsize=5)p = Process(target=ProducerA,args=(q,))c = Process(target=ConsumerB,args=(q,))c.start()p.start()c.join()p.join()
上述代码定义了生产者函数和消费者函数,设置其队列的最大容量是5,生产者不停的生产冷饮,消费者就不停的取出冷饮消费,当队列满时,生产者等待,当队列空时,消费者等待。
六、多进程之进程池Pool
进程池(Pool)按需创建进程,池满则请求排队等待。
import multiprocessing
import timedef task(name):print(f"{time.strftime('%H:%M:%S')}: {name} 开始执行")time.sleep(3)if __name__ == '__main__':pool = multiprocessing.Pool(processes=3)for i in range(10):# 维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去pool.apply_async(func=task, args=(i,))pool.close()pool.join()
从结果来看,同一时刻只有三个进程在执行,使用Pool实现了对进程并发数的控制
七、多进程之数据交换Pipe
在Python的多进程编程中,multiprocessing.Pipe() 方法可以创建一个管道,用于进程间的数据传输。
默认情况下,管道是全双工的,即两个进程可以互相发送和接收数据。如果需要设置为半双工(单向传输),可以通过传递参数duplex=False 来实现。
管道对象提供了send() 方法用于发送消息,以及recv() 方法用于接收消息。如果recv()在没有消息的情况下被调用,它会阻塞;如果管道已关闭,recv()会抛出EOFError
异常。
import multiprocessing
import timedef task1(pipe):for i in range(5):str = f"task1-{i}"print(f"{time.strftime('%H:%M:%S')}: task1 发送:{str}")pipe.send(str)time.sleep(2)for i in range(5):print(f"{time.strftime('%H:%M:%S')}: task1 接收:{ pipe.recv() }")def task2(pipe):for i in range(5):print(f"{time.strftime('%H:%M:%S')}: task2 接收:{pipe.recv()}")time.sleep(2)for i in range(5):str = f"task1-{i}"print(f"{time.strftime('%H:%M:%S')}: task2 发送:{ str }")if __name__ == '__main__':pipe = multiprocessing.Pipe()p1 = multiprocessing.Process(target=task1,args=(pipe[0],))p2 = multiprocessing.Process(target=task2,args=(pipe[1],))p1.start()p2.start()p1.join()p2.join()
首先程序定义了两个子进程函数:task1先发送5条消息,再接收消息;task2先接收消息,再发送消息。
相关文章:
Python运维之多进程!!
本节的快速导航目录如下喔!!! 一、创建进程的类Process 二、进程并发控制之Semaphore 三、进程同步之Lock 四、进程同步之Event 五、进程优先队列Queue 六、多进程之进程池Pool 七、多进程之数据交换Pipe 一、创建进程的类Process mu…...
Redis(无中心化集群搭建)
文章目录 1.无中心化集群1.基本介绍2.集群说明 2.基本环境搭建1.部署规划(6台服务器)2.首先删除上次的rdb和aof文件(对之前的三台服务器都操作)1.首先分别登录命令行,关闭redis2.清除/root/下的rdb和aof文件3.把上次的…...
基于springboot+jsp+Mysql的商务安全邮箱邮件收发
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
三.Django--ORM(操作数据库)
目录 1 什么是ORM 1.1 ORM优势 1.2ORM 劣势 1.3 ORM与数据库的关系 2 ORM 2.1 作用 2.2 连接数据库 2.3 表操作--设置字段 2.4 数据库的迁移 写路由增删改查操作 项目里的urls.py: app里的views.py: 注意点: 1 什么是ORM ORM中文---对象-关系映射 在MTV,MVC设计…...
【华为】AC直连二层组网隧道转发实验配置
【华为】AC直连二层组网隧道转发实验配置 实验需求拓扑配置AC数据规划表 AC的配置顺序AC1基本配置(二层通信)AP上线VAP组关联--WLAN业务流量 LSW1AR1STA获取AP的业务流量 配置文档 实验需求 AC组网方式:直连二层组网。 业务数据转发方式:隧道转发。 DHC…...
第 129 场 LeetCode 双周赛题解
A 构造相同颜色的正方形 枚举:枚举每个 3 3 3\times 3 33的矩阵,判断是否满足条件 class Solution {public:bool canMakeSquare(vector<vector<char>>& grid) {for (int i 0; i < 2; i)for (int j 0; j < 2; j) {int c1 0, c…...
GStreamer日志调试笔记
1、查询所有分类 #gst-launch-1.0 --gst-debug-help 2、查询videotestsrc的日志 #gst-launch-1.0 --gst-debug-help | findstr videotestsrc 结果: 3、使用--gst-debug设置相应日志类型的相应等级,越大显示日志越多,排查内存泄露可以设置为9 …...
【api接口开通教程】YouTube Data API v3申请流程
一、背景调查 1.1 API接口介绍 采集youtube数据,大体分为两种方案:一种是基于爬虫,一种是基于API接口。 说人话就是:爬虫相当于走后门、爬窗户(利用技术手段窃取,人家没说给,但我硬拿&#x…...
.net 6.0 框架集成ef实战,步骤详解
一、代码框架搭建 搭建如下代码架构: 重点含EntityFrameworkCore工程,该工程中包含AppDbContext.cs和数据表实体AggregateObject 1、AppDbContext 代码案例 //AppDbContext 代码案例using Microsoft.EntityFrameworkCore;namespace EntityFrameworkCo…...
[C/C++] -- 观察者模式
观察者模式是一种行为型设计模式,用于定义对象间的一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式涉及以下几个角色: 主题(Subject)&…...
秋招算法刷题8
20240422 2.两数相加 时间复杂度O(max(m,n)),空间复杂度O(1) public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode headnull,tailnull;int carry0;while(l1!null||l2!null){int n1l1!null?l1.val:0;int n2l2!…...
Docker使用方法
Docker是一种容器化平台,它可以帮助开发人员将应用程序和其依赖项打包成一个独立的、可移植的容器,以便在不同的环境中运行。 以下是使用Docker的基本步骤: 安装Docker:首先,您需要在您的机器上安装Docker。您可以从D…...
HTML学习|网页基本信息、网页基本标签、图像标签、超链接标签、列表标签、表格标签、媒体元素、页面结构分析、iframe内联框架
网页基本信息 DOCTYPE是设置使用什么规范,网页整个信息都在html标签中,head标签里包含字符集设置,网页介绍等信息,title标签是网页的名称,网页的主干都在body标签中 网页基本标签 标题标签 h1~h6都是标题标签&#x…...
001 websocket(评论功能demo)(消息推送)
文章目录 ReviewController.javaWebSocketConfig.javaWebSocketProcess.javaServletInitializer.javaWebsocketApplication.javareadmeindex.htmlapplication.yamlpom.xml ReviewController.java package com.example.controller;import com.example.websocket.WebSocketProces…...
二分查找向下取整导致的死循环69. x 的平方根
二分查找向下取整导致的死循环 考虑伪题目:从数组arr中查找出目标元素target对应的下标,如果数组中不存在目标元素,找 到第一个元素值小于target的元素的下标。 编写二分查找算法如下: Testvoid testBinarySearch(){int[] arr n…...
Kivy 异步任务
如果要进行一些非常耗时的操作(例如:爬虫等),那么页面就会在这里卡住,而系统就会以为这个软件无响应,并提示关闭,可以说明用户体验极差,因此我们在此处引入异步操作。 在py中引入事件调节器,并在…...
DEV--C++小游戏(吃星星(0.1))
目录 吃星星(0.1) 简介 头文件 命名空间变量 副函数 清屏函数 打印地图函数 移动函数 主函数 0.1版完整代码 吃星星(0.1) 注:版本<1为未实现或只实现部分 简介 用wasd去吃‘*’ 头文件 #include<bi…...
LINUX 入门 4
LINUX 入门 4 day6 7 20240429 20240504 耗时:240min 课程链接地址 第4章 LINUX环境编程——实现线程池 C基础 第3节 #define里面的行不能乱空行,要换行就打\ typedef 是 C 和 C 中的一个关键字,用于为已有的数据类型定义一个新的名字。…...
Imagine Flash、StyleMamba 、FlexControl、Multi-Scene T2V、TexControl
本文首发于公众号:机器感知 Imagine Flash、StyleMamba 、FlexControl、Multi-Scene T2V、TexControl You Only Cache Once: Decoder-Decoder Architectures for Language Models We introduce a decoder-decoder architecture, YOCO, for large language models, …...
Java Collections.emptyList() 方法详解
前言 在Java开发的日常中,我们常常需要处理集合数据结构,而这其中就免不了要面对“空集合”的场景。传统的做法可能是直接返回 null,但这往往会引入空指针异常的风险,降低了代码的健壮性。幸运的是,Java为我们提供了一…...
Vue前端环境准备
vue-cli Vue-cli是Vue官方提供的脚手架,用于快速生成一个Vue项目模板 提供功能: 统一的目录结构 本地调试 热部署 单元测试 集成打包上线 依赖环境:NodeJs 安装NodeJs与Vue-Cli 1、安装nodejs(已经安装就不用了) node-…...
代码随想录算法训练营第四十二天| 01背包问题(二维、一维)、416.分割等和子集
系列文章目录 目录 系列文章目录动态规划:01背包理论基础①二维数组②一维数组(滚动数组) 416. 分割等和子集①回溯法(超时)②动态规划(01背包)未剪枝版剪枝版 动态规划:01背包理论基…...
故障——蓝桥杯十三届2022国赛大学B组真题
问题分析 这道题纯数学,考察贝叶斯公式 AC_Code #include <bits/stdc.h> using namespace std; typedef pair<int,double> PI; bool cmp(PI a,PI b){if(a.second!b.second)return a.second>b.second;return a.first<b.first; } int main() {i…...
SSD存储基本知识
存储技术随着时间的推移经历了显著变化,新兴的存储介质正逐步挑战已经成为行业标准的硬盘驱动器(HDD)。在众多竞争者中,固态硬盘(SSD)是最广泛采用且最有潜力占据主导地位的——它们速度快、运行安静&#…...
buuctf-misc题目练习二
ningen 打开题目后是一张图片,放进winhex里面 发现PK,PK是压缩包ZIP 文件的文件头,下一步是想办法进行分离 Foremost可以依据文件内的文件头和文件尾对一个文件进行分离,或者识别当前的文件是什么文件。比如拓展名被删除、被附加…...
Nginx rewrite项目练习
Nginx rewrite练习 1、访问ip/xcz,返回400状态码,要求用rewrite匹配/xcz a、访问/xcz返回400 b、访问/hello时正常访问xcz.html页面server {listen 192.168.99.137:80;server_name 192.168.99.137;charset utf-8;root /var/www/html;location / {root …...
2024,AI手机“元年”? | 最新快讯
文 | 伯虎财经,作者 | 铁观音 2024年,小米、荣耀、vivo、一加、努比亚等品牌的AI手机新品如雨后春笋般涌现。因此,这一年也被业界广泛视为AI手机的“元年” 试想,当你轻触屏幕,你的手机不仅响应你的指令,更…...
5月9(信息差)
🌍 可再生能源发电量首次占全球电力供应的三成 🎄马斯克脑机接口公司 Neuralink 计划将 Link 功能扩展至现实世界,实现控制机械臂、轮椅等 马斯克脑机接口公司 Neuralink 计划将 Link 功能扩展至现实世界,实现控制机械臂、轮椅等…...
leetcode203-Remove Linked List Elements
题目 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5] 示例 2: 输入&…...
2024付费进群系统,源码及搭建变现视频课程(教程+源码)
自从我做资源站项目盈利稳定后,我越来越对网站类项目感兴趣了,毕竟很多网站类项目还是需要一定技术门槛的,可以过滤掉一些人,很多新人做项目就只盯着短视频,所以网站类项目也就没那么的卷。 这个付费进群系统…...
做网站 bs cs/太原百度快速优化排名
普通情况下 radio 单选框仅仅能实现多选一的效果,可是一旦选择当中一个后,这个单选框就不可点击取消其选中状态了。这样的功能在某些业务环境下并不适用。有时我们既须要单选框的多选一效果。也须要复选框的可点击取消效果。为此本文提供一种 JQuery 写法…...
seo网站架构设计/企业网站建设的作用
1、Linux系统简单介绍 Linux是一套免费使用, 支持多用户、多任务、支持多线程和多个核心CPU的操作系统;很多中型, 大型甚至是巨型项目都在使用Linux。 Linux的发行版说简单点就是将Linux与应用软件做一个打包, 目前市面上比较知名的发行版有: Ubuntu, RedHat, Cen…...
毕设web网站开发/p2p万能搜索种子
一、概念 IoC是Inversion of Control的缩写,有的翻译成“控制反转”,还有翻译为“控制反向”或者“控制倒置”。二、什么是IoC IoC就是IoC,不是什么技术,与GoF一样,是一种设计模式。在Spring中控制反转是Spring框架的核…...
承德网站制作/微信营销的成功案例
题意 给定两个三角形的三点坐标和其速度矢量,询问两三角形是否会相撞,注意题目中描述,如果点相接触也算碰撞。 题解 首先求出相对速度,即让两速度矢量相减即可。这样就可以看做一个三角形静止,另一个运动了。此时&a…...
地坪漆东莞网站建设技术支持/辽宁网站建设
我们在有些开发时候可能会用到些头条的文章,,添加过程如下所示: 我们在前台遍历数据的时候可以这样, 然后在后台更新首页模版后在去看下首页,效果如下所示: 转载于:https://www.cnblogs.com/leigood/p/5301…...
成都有几家做网站的公司/百度站长工具收费吗
springboot学习比较总结:https://pan.baidu.com/s/1dYwvpk spring STS工具安装:https://blog.51cto.com/qinbin/2067347Java系统部署脚本:当想把程序放到后台运行: nohup ./your_command &部署Java:1. 在eclips…...