首页 > 系统相关 >Python进阶:进程的状态及基本操作

Python进阶:进程的状态及基本操作

时间:2023-06-09 14:06:41浏览次数:40  
标签:__ 进阶 迭代 Python 队列 进程 基本操作 multiprocessing pool




文章目录

  • Python 进阶篇-系列文章全篇
  • 一、进程以及状态
  • 二、[重点]进程-基本使用
  • 三、[重点]进程-名称、PID
  • 四、[重点]进程-参数传递、全局变量问题
  • 五、[重点]进程-守护主进程
  • 六、进程、线程对比
  • 七、[重点]消息队列-基本操作
  • 八、消息队列-常见判断
  • 九、[重点]Queue实现进程间通信
  • 十、[重点]进程池Pool
  • 十一、进程池中的Queue
  • 十二、案例:文件夹copy器(多进程版)
  • 十三、[重点]可迭代对象及检测方法
  • 十四、[重、难点]迭代器及其使用方法

一、进程以及状态

  • 进程:资源分配的基本单位,也是线程的容器
  • 进程的状态:
    * 新建
    * 就绪
    * 运行
    * 等待
    * 死亡

二、[重点]进程-基本使用

  • 进程使用的步骤:
  • 导入模块

import multiprocessing

  • 创建子进程对象

process_obj = multiprocessing.Process(target=work1)

  • 启动子进程

process_obj.start()

三、[重点]进程-名称、PID

  • 获取进程的名称

multiprocessing.current_process()

设置名称:

multiprocessing.Process(target=xxxx, name=“进程名称”)

  • 获取进程的编号
  1. multiprocessing.current_process().pid
  2. os.getpid()
  • 获取进程的父id

os.getppid()

  • 结束进程

Kill -9 进程的编号

四、[重点]进程-参数传递、全局变量问题

  • 进程的参数传递
  • args 元组
  • kwargs 字典
  • 混合args 和 kwargs

# 1)使用 args 传递元组 # 2)使用 kwargs 传递字典 # 3)混合使用 args 和 kwargs # process_obj = multiprocessing.Process(target=work1, args=(10, 100,1000)) # process_obj = multiprocessing.Process(target=work1, kwargs={"c": 1000, "a": 10, "b": 100}) process_obj = multiprocessing.Process(target=work1, args=(10, ), kwargs={"c": 1000, "b": 100})

  • 进程间共享全局变量的问题

进程间是不能够共享全局变量

底层原理:子进程会复制主进程的资源到内部运行

五、[重点]进程-守护主进程

  • 进程守护: 子进程和主进程的一种约定,当主进程结束的时候,子进程也随之结束

process_obj.daemon = True

  • 结束子进程

# terminate() 终止子进程的执行 process_obj.terminate()

六、进程、线程对比

  • 进程和线程的对比
  • 进程是资源分配的基本单位,线程是CPU调度的基本单位
  • 进程运行需要独立的内存资源, 线程需要到的是必不可少的一点资源
  • 进程切换慢,线程切换更快
  • 线程不能独立运行,必须运行在进程中(进程能提供资源)
  • CPU密集型 进程优先, I/O 密集型使用线程
  • 程序更稳定进程,线程相比较不够稳定
  • 不是非此即彼,而是组合使用

七、[重点]消息队列-基本操作

  • 消息队列的学习的目的:为了实现进程间的通信
  • 队列的创建:
  • 导入模块 multiprocessing
  • multiprocessing.Queue(5) # 队列长度为5
  • 队列的操作:
  • 放入值 queue.put(值) —>从队列尾部放入值
  • 取值: queue.get() --> 从队列头部取值
  • xxxx_nowait() 方式
  • 放入值 put_nowait() 特点:队列未满,同put() 但是队列已满,会报错,不等待
  • 取值 get_nowait() 特点:队列未空,同get() 但是队列已空,会报错,不等待

八、消息队列-常见判断

  • 常见的判断
  • full() 判断是否已满
  • empty() 判断是否为空
  • 取出队列中消息的数量
  • qsize()

九、[重点]Queue实现进程间通信

  • 思路:利用队列在两个进程间进行传递,进而实现数据共享
  • write_queue(queue)
  • read_queue(queue)
  • 创建一个空队列
  • 把空队列作为参数,先把队列传递给写进程,然后把队列再传递给读进程
  • join() 优先让一个进程先执行完成,另外一个进程才能启动

十、[重点]进程池Pool

  • 进程池:是一个进程的容器,可以自动帮我们创建指定数量的进程,并且管理进程及工作
  • 创建方法:
  1. 导入模块
  2. 创建进程池
    pool = multiprocessing.Pool(3)
  • 工作方式:
  • 同步方式:
    pool.apply(函数名,(参数1,参数2,…))
    进程池中的进程,一个执行完毕后另外一个才能执行,多个进程执行有先后顺序
  • 异步方式:
    pool.apply_async(函数名,(参数1,参数2,…))
    进程池中的进程,多个进程同时执行,没有先后顺序
    1) 进程池要 close() 表示不再接受新的任务

pool.close()

  • 2)还要join() 表示让主进程等待进程池执行结束后再退出

pool.join()

十一、进程池中的Queue

  • 获取方法:

# 1、创建进程池 pool = multiprocessing.Pool(2) # 2、创建进程池中的队列 queue = multiprocessing.Manager().Queue(5)

# apply_async() 返回值 ApplyResult对象,该对象由一个 wait() 的方法 # wait() 方法类似join() 表示先让当前进程执行完毕,后续进程才能启动 result = pool.apply_async(write_queue, (queue, )) result.wait() pool.apply_async(read_queue, (queue, )) # close()表示不再接收新的任务 pool.close() # 主进程会等待进程池执行结束后再退出 pool.join()

十二、案例:文件夹copy器(多进程版)

  • 思路:

./test/ ---------> /home/demo/Desktop/test/

思路:
1、定义变量,保存源文件夹、目标文件夹所在的路径
2、在目标路径创建新的文件夹
3、获取源文件夹中的所有的文件(列表)
4、遍历列表,得到所有的文件名
5、定义函数,进行文件拷贝

文件拷贝函数:
参数: 源文件夹路径 目标文件夹路径 文件名
1、拼接源文件和目标文件的具体路径
2、打开源文件,创建目标文件
3、读取源文件的内容,写入到目标文件中 (while)

  • 进程池拷贝文件

# 创建进程池 pool = multiprocessing.Pool(3) # 4、遍历列表,得到所有的文件名 for file_name in file_list: # print(file_name) # 5、定义函数,进行文件拷贝 # copy_work(source_dir, dest_dir, file_name) pool.apply_async(copy_work, (source_dir, dest_dir, file_name)) # close() 不再接收新的任务 pool.close() # 让主进程等待进程池结束后在退出 pool.join()

  • 创建文件夹

os.mkdir(路径)

  • 获取文件夹中的内容

os.listdir(路径)

十三、[重点]可迭代对象及检测方法

  • 可迭代对象

# 1、可遍历对象就是可迭代对象 # 2、列表、元组、字典、字符串都是可迭代对象 # 3、100 和 自定义myclass 默认都是不可以迭代的 # 4、myclass 对象所属的类 MyClass 如果包含了 __iter__() 方法,此时 # myclass就是一个可迭代对象 # 5、可迭代对象的本质:对象所属的类中包含了 __iter__() 方法

  • 可迭代对象的检测:

# 6、检测一个对象是否可以迭代,用 isinstance() 函数检测

十四、[重、难点]迭代器及其使用方法

  • 迭代器的作用:

1) 记录当前迭代的位置 2)配合next() 获取可迭代对象的下一个元素值

  • 获取迭代器

iter(可迭代对象)

  • 获取可迭代对象的值

next(迭代器)

  • for循环的本质:

1)通过 iter(要遍历的对象) 获取要遍历的对象的迭代器
2)next(迭代器)获取下一个元素
3)帮我们捕获了 StopIteration 异常

  • 自定义迭代器类

# 自定义迭代器类,满足2点 # 1)必须含有 __iter__() # 2) 必须含有 __next__()class MyIterator(object): def __iter__(self): pass # 当 next(迭代器) 的时候,会自动调用该方法 def __next__(self): pass


标签:__,进阶,迭代,Python,队列,进程,基本操作,multiprocessing,pool
From: https://blog.51cto.com/u_8238263/6446892

相关文章

  • Python进阶:利用线程实现多任务
    文章目录Python进阶篇-系列文章全篇一、多任务的介绍二、[重点]线程-基本使用三、[重点]线程-线程名称、总数量四、[重点]线程-参数及顺序五、[重点]线程-守护线程六、并行和并发七、[重、难点]自定义线程类八、[重点]多线程-共享全局变量九、[难点]多线程-共享全局变量-问......
  • python tkinter 动态批量建立Widget时,combobox 或 entry传递参数问题
    terminal_combobox.bind('<<ComboboxSelected>>',lambdaevent,arg=key_dict:self.terminal_select(key_dict=arg))#注意,传递参数方法defterminal_select(self,key_dict,*args):var=self.dict_widget[key_d......
  • python爬虫概念
    Python爬虫是指使用Python编写程序来自动化地提取互联网上的信息(如文本、图像、视频、音频等)。它通常使用HTTP协议向Web服务器发送请求,并通过解析HTML响应来提取所需的信息。Python爬虫可以用于数据挖掘、信息收集、自动化测试等任务。常用的Python爬虫库包括BeautifulSoup、lxml......
  • 实验6 turtle绘图与python库应用编程体验
    实验任务1:task1_1实验源码:1fromturtleimport*234defmove(x,y):5penup()6goto(x,y)7pendown()8910defdraw(n,size=100):11foriinrange(n):12fd(size)13left(360/n)141516defmain():17......
  • python - execjs使用crypto-js
    最近在研究一个网站发现网站使用了des加密,觉得使用python调用js可读性比较高,所以使用了以下方法来实现该网站的内容解密1.安装PyExecJSpip3installPyExecJs2.安装node.jshttps://nodejs.org/en/download3.node安装jsdom,crypto-js可以到py文件目录在运行npm,方便调用np......
  • python操作excel之 openpyxl
    python操作excel在我们的工作中经常会用到,操作用例读取对应信息进行接口自动化pythonExcel库对比图片我们发现可以操作excel的库有很多种,我们常用的就三种方法第三方库xlwt/xlrd:用于生成和读取比较老的excel文件,比如xls格式,最大行数限制为65536行。其中xlrd是读excel,xlwt是写exc......
  • python-opencv之人脸检测
    引用网址:https://www.it610.com/article/1546269872961425408.htm文章目录一、概述二、相关概念三、实际操作1.图片检测2.打开摄像头进行人脸检测 一、概述`本文为我学习python环境下用opencv检测人脸的内容总结。二、相关概念##opencv中提供了三种训练好的级联分类器(通过不同特......
  • Python是不是被严重高估了?
    目前来说,Python是一门非常流行的编程语言,它具有简单易学、代码可读性高、拥有丰富的第三方库等优点,因此在很多领域都得到了广泛的应用。但是,对于不同的应用场景和需求,不同的编程语言都有其优劣之处,没有一种编程语言是完美的。因此,我认为Python并没有被严重高估,而是在适合的领域得到......
  • Python基础语法学习
    基础语法1、常量、表达式print(1+2-4)print(1+3*4)形如:1+2-3这个就叫表达式,表达式的结果叫做叫做返回值123这样的数字称为字面值常量,+-*叫做运算符注意在py中2/3=0.66666而不是c语言中的0在C中整数除整数结果还是整数且会把小数直接舍去,在编程中一般不会有......
  • 记录一次 nas docker 运行出错 使用Python脚本检查错误并重启对应容器 npc 运行出
    importosimporttimeimportdatetimeimportsubprocessimportmysql.connector#Docker容器名称container_name="containerName"#MySQL数据库连接配置db_host="localhost"db_user="*********"db_password="*********"db_......