Python入门-多进程
1.获取本机CPU
# 早期的CPU是单核:实现多个程序并行,在某一时间点,其实只有一个进程
# 后来硬件多核CPU:多个进程是并行执行。 from multiprocessing import cpu_count print("CPU内核数量:", cpu_count())
"""
生命周期为:
1.分配pcb
2.获得山下文资源,等待CPU
3.CPU已获得,开始执行
4.如遇到无法执行,进入阻塞状态
5.到达自然结束点或者意外终结,进入终止状态
"""
进程类
import multiprocessing
import time class Mypro(multiprocessing.Process):
def __init__(self, name, delay, count):
super().__init__(name=name) # 同时使用父类和子类的初始化
self.__delay = delay
self.__count = count
def run(self):
for i in range(self.__count):
print("{}=进程id为:{}, 进程名字为:{}".format(i,
multiprocessing.current_process().pid,
multiprocessing.current_process().name))
time.sleep(1) # 减慢代码执行速度
if __name__ == '__main__':
for i in range(3):
#创建进程对象
pro = Mypro(name="类进程-{}".format(i),
delay=1,
count=10)
pro.start() #进程启动 """
0=进程id为:15200, 进程名字为:类进程-0
0=进程id为:1148, 进程名字为:类进程-1
0=进程id为:9608, 进程名字为:类进程-2
1=进程id为:15200, 进程名字为:类进程-0
1=进程id为:1148, 进程名字为:类进程-1
1=进程id为:9608, 进程名字为:类进程-2
2=进程id为:15200, 进程名字为:类进程-0
2=进程id为:1148, 进程名字为:类进程-1
2=进程id为:9608, 进程名字为:类进程-2
3=进程id为:15200, 进程名字为:类进程-0
3=进程id为:1148, 进程名字为:类进程-1
3=进程id为:9608, 进程名字为:类进程-2
"""
多进程
import multiprocessing
import time def worker(count): # 专门的处理函数
for i in range(count):
print("{}=进程id为:{}, 进程名字为:{}".format(i,
multiprocessing.current_process().pid,
multiprocessing.current_process().name))
time.sleep(1) #减慢代码执行速度
def main():
print("主进程id为:{}, 进程名字为:{}".format(
multiprocessing.current_process().pid,
multiprocessing.current_process().name))
time.sleep(1)
if __name__ == '__main__':
print("==============主进程===============")
main()
print("==============子进程===============") for i in range(3):
#开始创建进程对象
pro = multiprocessing.Process(
target=worker,
args=(10,),
name="测试进程{}:".format(i))
pro.start() # 执行进程启动 """
python程序都是通过主进程开始的,而后通过Process定义的进程都属于子进程
==============主进程===============
主进程id为:10556, 进程名字为:MainProcess
==============子进程===============
0=进程id为:5704, 进程名字为:测试进程0:
0=进程id为:588, 进程名字为:测试进程1:
0=进程id为:5352, 进程名字为:测试进程2:
1=进程id为:5704, 进程名字为:测试进程0:
1=进程id为:588, 进程名字为:测试进程1:
1=进程id为:5352, 进程名字为:测试进程2:
2=进程id为:588, 进程名字为:测试进程1:
2=进程id为:5352, 进程名字为:测试进程2:
2=进程id为:5704, 进程名字为:测试进程0:
"""
进程控制
import multiprocessing as mp
import time def send(msg):
time.sleep(5)
print("进程id:{},进程名称:{}".format(
mp.current_process().pid,
mp.current_process().name)) #获取当前进程信息 def main1():
pro = mp.Process(
target=send,
args=("www.baidu.com",),
name="main1,子进程发送中"
)
pro.start()
print("main1,主发送进程id:{},发送进程名字:{},信息已发送完毕!!!".format(
mp.current_process().name,
mp.current_process().pid
)) # 主进程的信息,在子进程执行完毕后才会输出 def main2():
pro = mp.Process(
target=send,
args=("www.baidu.com",),
name="main2,子进程发送中"
)
pro.start()
pro.join()# 子进程强制优先执行
print("main2,主发送进程id:{},发送进程名字:{},信息已发送完毕!!!".format(
mp.current_process().name,
mp.current_process().pid
)) # 主进程的信息,在子进程执行完毕后才会输出
if __name__ == '__main__':
print("===========主进程优先演示==============")
main1()
print("===========强制优先子进程演示============")
main2() """
===========主进程优先演示==============
main1,主发送进程id:MainProcess,发送进程名字:15652,信息已发送完毕!!!
===========强制优先子进程演示============
进程id:15152,进程名称:main2,子进程发送中进程id:7376,进程名称:main1,子进程发送中
main2,主发送进程id:MainProcess,发送进程名字:15652,信息已发送完毕!!!
"""
守护进程
# 守护进程,随主进程进行 import multiprocessing
import time #创建守护进程
def status():
item = 1
while True:
print("守护进程id:{}, 守护进程名字:{}======{}".format(
multiprocessing.current_process().pid,
multiprocessing.current_process().name,item
))
item += 1
time.sleep(1)
#工作进程函数
def worker():
shouhu_pro = multiprocessing.Process(target=status, name="守护进程", daemon=True)
shouhu_pro.start()
for i in range(10):
print("工作id:{}, 工作进程:{}".format(
multiprocessing.current_process().pid,
multiprocessing.current_process().name
))
time.sleep(1)
if __name__ == '__main__':
def main():
work_pro = multiprocessing.Process(target=worker, name="工作进程")
work_pro.start() #启动工作进程
main()
"""
工作id:6000, 工作进程:工作进程
守护进程id:5248, 守护进程名字:守护进程======1
工作id:6000, 工作进程:工作进程
守护进程id:5248, 守护进程名字:守护进程======2
工作id:6000, 工作进程:工作进程
守护进程id:5248, 守护进程名字:守护进程======3
工作id:6000, 工作进程:工作进程
守护进程id:5248, 守护进程名字:守护进程======4
工作id:6000, 工作进程:工作进程
守护进程id:5248, 守护进程名字:守护进程======5
工作id:6000, 工作进程:工作进程
守护进程id:5248, 守护进程名字:守护进程======6
工作id:6000, 工作进程:工作进程
守护进程id:5248, 守护进程名字:守护进程======7
工作id:6000, 工作进程:工作进程
守护进程id:5248, 守护进程名字:守护进程======8
工作id:6000, 工作进程:工作进程
守护进程id:5248, 守护进程名字:守护进程======9
工作id:6000, 工作进程:工作进程
守护进程id:5248, 守护进程名字:守护进程======10
"""
fork创建子进程,Windows平台无法执行
import os
import multiprocessing as mp #fork创建的子进程是,不能跨平台的
def child(): #子进程
print("【child】父进程id:{} ,子进程id:{}".format(
os.getppid(), os.getpid()))
if __name__ == '__main__':
def main():
print("【main】进程id:{}, 进程名称:{}".format(
mp.current_process().pid, mp.current_process().name
))
#创建子进程
newpid = os.fork()
print("新的fork,子进程id:", newpid)
if newpid == 0:
child()
else:
print("父进程执行中:", os.getpid())
main()
psutil模块,跨平台模块
#psutil是进程管理的,第三方模块,可以跨平台使用
import time
import psutil #获取进程信息
for i in psutil.process_iter():
print("进程编号:{}, 进程名称:{}, 创建时间:{}".format(
i.pid, i.name(), time.ctime( i.create_time())[11:20]
)) #关闭进程
for i in psutil.process_iter():
if i.name() == "notepad.exe":
i.terminate() #关闭进程 """
进程编号:14460, 进程名称:SogouCloud.exe, 创建时间:20:35:46
进程编号:15124, 进程名称:chrome.exe, 创建时间:20:35:53
进程编号:15492, 进程名称:QQLiveService.exe, 创建时间:20:37:34
进程编号:16044, 进程名称:dllhost.exe, 创建时间:20:49:34
进程编号:16048, 进程名称:chrome.exe, 创建时间:21:53:06
进程编号:16076, 进程名称:Lenovo.Modern.ImController.PluginHost.Device.exe, 创建时间:20:37:41
进程编号:16252, 进程名称:chrome.exe, 创建时间:21:54:45
""" #获取CPU信息
print("获取CPU的数量:", psutil.cpu_count(logical=False))
print("获取CPU的逻辑数量:", psutil.cpu_count(logical=True))
print("用户CPU的使用时间:", psutil.cpu_times().user)
print("系统CPU的使用时间:", psutil.cpu_times().system)
print("CPU的空闲时间:", psutil.cpu_times().idle)
for i in range(10):
print("cpu使用监控:", psutil.cpu_percent(interval=1,percpu=True))
"""
获取CPU的数量: 4
获取CPU的逻辑数量: 8
用户CPU的使用时间: 1650.5625
系统CPU的使用时间: 1302.109375
CPU的空闲时间: 44414.21875
cpu使用监控: [23.9, 12.3, 15.2, 9.1, 20.0, 7.6, 19.7, 7.7]
cpu使用监控: [10.6, 6.2, 7.6, 3.1, 6.2, 4.7, 4.7, 10.8]
cpu使用监控: [25.7, 9.2, 15.9, 6.2, 20.0, 10.8, 25.4, 13.6]
cpu使用监控: [23.9, 7.7, 19.4, 4.6, 12.3, 9.2, 22.4, 12.3]
cpu使用监控: [11.9, 3.1, 9.1, 1.5, 6.1, 4.6, 10.8, 10.6]
cpu使用监控: [22.1, 12.1, 16.4, 9.4, 9.4, 12.3, 15.2, 16.9]
cpu使用监控: [20.6, 7.8, 15.2, 7.7, 7.7, 3.1, 23.2, 13.4]
cpu使用监控: [28.6, 27.3, 22.7, 14.1, 23.4, 14.1, 47.0, 9.4]
cpu使用监控: [17.6, 4.6, 3.1, 3.1, 10.6, 7.7, 6.2, 7.7]
cpu使用监控: [21.4, 6.1, 9.2, 10.6, 9.1, 3.1, 10.4, 12.3]
""" # 获取磁盘的使用情况
print("获取磁盘信息:", psutil.disk_partitions())
print("获取磁盘使用率:", psutil.disk_usage("c:"))
print("获取磁盘io使用率:", psutil.disk_io_counters())
"""
获取磁盘信息: [sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260), sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260), sdi]
获取磁盘使用率: sdiskusage(total=126696288256, used=89786765312, free=36909522944, percent=70.9)
获取磁盘io使用率: sdiskio(read_count=173668, write_count=113137, read_bytes=4293250560, write_bytes=2654279168, read_time=963, write_time=93)
""" #获取网络信息
print("网络交互信息,数据统计:", psutil.net_io_counters())
print("网络交互信息,接口统计:", psutil.net_if_addrs())
print("网络交互信息,接口状态:", psutil.net_if_stats())
"""
网络交互信息,数据统计: snetio(bytes_sent=10740489, bytes_recv=254469269, packets_sent=67731, packets_recv=104577, errin=0, errout=0, dropin=0, dropout=0)
网络交互信息,接口统计: {'以太网': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='8C-16-45-92-1A-5B', netmask=None, broadcast=None, ptp=None), )}
网络交互信息,接口状态: {'以太网': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500), }
"""
进程池
# 把多个进程放在进程池中,进行统一管理,提高性能的复用性
import time
import multiprocessing as mp
def work(item):
time.sleep(1)
return "工作进程id:{},进程名称:{}, item={}".format(
mp.current_process().pid,
mp.current_process().name,
item
)
if __name__ == '__main__':
pool = mp.Pool(processes = 2)
for i in range(10):
res = pool.apply_async(func=work, args=(i,)) # 非阻塞形式执行进程获取结果
print(res.get())
pool.close()
pool.join()
Python入门-多进程的更多相关文章
- 简述Python入门小知识
如今的Python开发工程师很受企业和朋友们的青睐,现在学习Python开发的小伙伴也很多,本篇文章就和大家探讨一下Python入门小知识都有哪些. 扣丁学堂简述Python入门小知识Python培训 ...
- Python入门 ---基础知识
Python入门不知道这些你还是承早放弃吧!真的 Python 简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言 ...
- Python 入门网络爬虫之精华版
Python 入门网络爬虫之精华版 转载 宁哥的小站,总结的不错 Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 另外,比较常用的爬虫框架Scrapy,这里最后也详细介绍一下. 首先列举 ...
- Python入门学习指南
对于初学者,入门至关重要,这关系到初学者是从入门到精通还是从入门到放弃.以下是结合Python的学习经验,整理出的一条学习路径,主要有四个阶段 NO.1 新手入门阶段,学习基础知识 总体来讲,找一本靠 ...
- 6 小时 Python 入门
6 小时 Python 入门 以下操作均在 Windows 环境下进行操作,先说明一下哈 一.安装 Python 1.官网下载 Python 进入官网(https://www.python.org), ...
- 【python】多进程锁multiprocess.Lock
[python]多进程锁multiprocess.Lock 2013-09-13 13:48 11613人阅读 评论(2) 收藏 举报 分类: Python(38) 同步的方法基本与多线程相同. ...
- python入门简介
Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...
- python入门学习课程推荐
最近在学习自动化,学习过程中,越来越发现coding能力的重要性,不会coding,基本不能开展自动化测试(自动化工具只是辅助). 故:痛定思痛,先花2个星期将python基础知识学习后,再进入自动化 ...
- Python运算符,python入门到精通[五]
运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.例如:2+3,其操作数是2和3,而运算符则是“+”.在计算器语言中运算符大致可以分为5种类型:算术运算符.连接运算符.关系运算符.赋值运 ...
随机推荐
- TypeScript 2.0开启空值的严格检查
摘要:在编程过程成空指针是最常见的bug之一,但是在TypeScript中我们无法使用具体的类型来表示特定的变量不能为空!幸运的是,TypeScript 2.0 解决了这个问题. 本文分享自华为云社区 ...
- java面试:多线程
1.多线程 同步:发送一个指令需要等待返回才能发送下一条(完成一件事才能做下一件). 异步:发送一个请求不需要等待返回,随时可以再发下一条(一次进行多个事件) 线程不安全根本原因是异步,对一个 ...
- 字符串的高级应用-char a[100] = "1+2=;3-2=;2*5=;8/4=;" 得到char a[100] ="1+2=3;3-2=1;2*5=10;8/4=2;"
1 #include<stdio.h> 2 #include<string.h> 3 4 int main() 5 { 6 char a[100] = "1+2=;3 ...
- linux内存(三)内核与用户空间交互
来自网址http://www.kerneltravel.net/jiaoliu/005.htm 用户程序和内核的信息交换是双向的,也就是说既可以主动从用户空间向内核空间发送信息,也可以从内核空间向用户 ...
- Discuz 7.x、6.x 全局变量防御绕过导致代码执行
0x01 分析 由于php5.3.x版本里php.ini的设置里request_order默认值为GP,导致REQUEST中不再包含_REQUEST中不再包含REQUEST中不再包含_COOKIE, ...
- Cobalt Strike的安装
一.下载 压缩包下载回来之后,可以看到里面的文件有这些: 其中搭建团队服务器端的关键文件有两个,一个是cobaltstrike.jar,另一个是teamserver,这里我打算将团队服务器端搭在我的v ...
- 西门子S210电机位置控制过调问题解决方法
问题描述 创建完工艺对象,使用MC_MoveAbsolute工艺指令进行绝对定位,发现在下达指令后,电机会出现先超过目标位置再回调的现象,即过冲. 电机连接的机械结构为旋转轴,而不是线性轴. 解决方法 ...
- kvm管理查看信息,添加,删除,暂停恢复,克隆等
KVM virsh管理指令 virsh 查看帮助信息 查看命令帮助 [root@KVM ~]# virsh Welcome to virsh, the virtualization interacti ...
- Golang之框架篇-Windows环境bee工具运行beego
bee工具简介及好处 bee 工具是一个为了协助快速开发 beego 项目而创建的项目,通过 bee 你可以很容易的进行 beego 项目的创建.热编译.开发.测试.和部署. 强烈推荐新手或J ...
- 为什么redis 需要把所有数据放到内存中?
答:Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数 据写入磁盘.所以 redis 具有快速和数据持久化的特征.如果不将数据放在内存中, 磁盘 I/O 速度为严重影响 red ...