当前位置: 首页 > news >正文

Python多进程(multiprocessing)(mp)(二) —— 创建多进程 继承process类 进程池(Pool)

Process实例有2个重要属性:name和pid

Process实例的方法

#导入模块
import multiprocessing
import time

#定义进程执行函数
def clock(interval):
	for i in range(5):
		print('当前时间为{0}: '.format(time.ctime()))
		time.sleep(interval)

if __name__=='__main__':
	#创建子进程
	p=multiprocessing.Process(target=clock,args=(1,))
	#启动子进程
	p.start()
	p.join()
	#获取进程的 ID
	print('p.id:',p.pid)
	#获取进程的名称
	print('p.name:',p.name)
	#判断进程是否运行
	print('p.is_alive:',p.is_alive())

创建多个进程

执行不同的任务

#导入模块
import multiprocessing
import time

#创建进程调用函数
def work1(interval):
	print('执行work1')
	time.sleep(interval)
	print('end work1')

def work2(interval):
	print('执行work2')
	time.sleep(interval)
	print('end work2')

def work3(interval):
	print('执行work3')
	time.sleep(interval)
	print('end work3')

if __name__=='__main__':
	print('执行主进程')
	#创建进程对象
	p1=multiprocessing.Process(target=work1,args=(4,))
	p2=multiprocessing.Process(target=work2,args=(3,))
	p3=multiprocessing.Process(target=work3,args=(2,))
	#启动进程
	p1.start()
	p2.start()
	p3.start()
	p1.join()
	p2.join()
	p3.join()
	print('主进程结束')

继承process类创建进程

      像Java一样,也有2种方式创建进程

      创建进程的方式还可以使用类的方式,可以自定义一个类,继承 Process 类,重写run方法,每次实例化这个类的时候,就等同于实例化一个进程对象
 

#导入模块
from multiprocessing import Process
import time

#定义线程类
class ClockProcess(Process):
	def __init__(self,interval):
		Process.__init__(self)
		self.interval=interval
	def run(self):
		print('子进程开始执行的时间:{}'.format(time.ctime()))
		time.sleep(self.interval)
		print('子进程结束的时间:{}'.format(time.ctime()))

if __name__=='__main__':
	#创建子进程
	p=ClockProcess(2)
	#调用子进程
	p.start()
	p.join()
	print('主进程结束')

进程池

      在利用 Python 进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用multiprocessing 中的 Process 动态成生多个进程,十几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。

      Pool 可以提供指定数量的进程,供用户调用,当有新的请求提交到 pool 中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程

Pool(numprocess, initializer, initargs)

      其中 numprocess 是要创建的进程数。如果省略此参数,将使用 cpu_count()的值。cpu是4核,就创建有4个进程的进程池,8核就创建8个进程的进程池

      Initializer是每个工作进程启动时要执行的可调用对象。 Initargs 是要传递给 initializer 的参数元祖。

      Initializer 默认为 None

import multiprocessing
import time

def func(msg):
	print("start:", msg)
	time.sleep(3)
	print("end: ",msg)

if __name__ == "__main__":
	pool = multiprocessing.Pool(processes = 3)
	for i in range(5):
		msg = "任务%d" %(i)
		#维持执行的进程总数为 processes,当一个进程执行完毕后会添加新的进程进去
		pool.apply_async(func, (msg, ))
	pool.close()#进程池关闭之后不再接收新的请求
	#调用 join 之前,先调用 close 函数,否则会出错。
	# 执行完 close 后不会有新的进程加入到 pool,join 函数等待所有子进程结束
	pool.join()

apply_async 是在一个池工作进程中异步地执行函数(*args, **kwargs),然后返回结果

apply是在一个池工作进程中执行函数(*args, **kwargs),然后返回结果。
 

这是使用apply执行线程池的线程的

import multiprocessing
import time

def func(msg):
	print("start:", msg)
	time.sleep(3)
	print("end",msg)

if __name__ == "__main__":
	pool = multiprocessing.Pool(processes = 3)
	for i in range(5):
		msg = "任务%d" %(i)
		#维持执行的进程总数为 processes,当一个进程执行完毕后会添加新的进程进去
		pool.apply(func, (msg, ))
	pool.close()
	#调用 join 之前,先调用 close 函数,否则会出错。
	# 执行完 close 后不会有新的进程加入到 pool,join 函数等待所有子进程结束
	pool.join()

相关文章:

  • Python多进程(multiprocessing)(mp)(三) —— 进程间通信 Queue队列(Manager)
  • Python多线程(二): 线程同步 生产者消费者模式 ThreadLocal线程局部变量
  • 爬虫url去重策略
  • 爬虫中的深搜和广搜
  • Objective-C
  • MyOS(四):让内核突破512字节的限制
  • Go语言实现并发(协程)
  • 汇编语言相关知识
  • 面向对象的意义
  • 文本大数据挖掘项目(Go语言)
  • Python网络编程
  • CUDA与cuDNN
  • AI中的搜索(一)——启发式搜索 ((贪婪)最佳优先搜索 (Greedy)Best-First Search、A* 、迭代加深搜索 和 IDA* )
  • AI中的搜索(二)——对抗搜索(最小最大搜索Minimax、Alpha-Beta剪枝搜索、蒙特卡洛树搜索MCTS)
  • Web1.0 与 Web2.0 时代
  • 《深入 React 技术栈》
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Angular Elements 及其运作原理
  • centos安装java运行环境jdk+tomcat
  • Docker容器管理
  • extract-text-webpack-plugin用法
  • java正则表式的使用
  • mysql常用命令汇总
  • Promise初体验
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • ViewService——一种保证客户端与服务端同步的方法
  • VuePress 静态网站生成
  • 对象管理器(defineProperty)学习笔记
  • 小而合理的前端理论:rscss和rsjs
  • 【干货分享】dos命令大全
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • 移动端高清、多屏适配方案
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • (2)nginx 安装、启停
  • (八)Flask之app.route装饰器函数的参数
  • (分布式缓存)Redis持久化
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (南京观海微电子)——I3C协议介绍
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)创业的注意事项
  • .libPaths()设置包加载目录
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET学习全景图
  • @JSONField或@JsonProperty注解使用
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [Android]使用Git将项目提交到GitHub
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [Codeforces] number theory (R1600) Part.11
  • [CodeForces-759D]Bacterial Melee
  • [DL]深度学习_Feature Pyramid Network