多任务编程-进程

1、前后端过程

前端知识:HTML、CSS、JS、Jquery等
后端知识:多任务、网络编程及python高级语法

1,用户通过浏览器先访问前端页面(web服务器静态资源)–获得排版信息

2,想看到商品详细信息,需要访问另一台服务器(web服务器动态资源),看到的信息来自数据库

两个服务器的请求才能让我们看到完整的信息页面

ETL数据仓库:用来记录用户的行为(点击行为,访问行为等)存储页面上的id编号–用来分析用户感兴趣的方面
数据分析 – 从数仓中取数据,做用户画像

在这里插入图片描述
python是后端开发语言。例如我们登录账号----就是发送的后端请求,python定义一个函数来判断

2、多任务介绍

登录场景中,100个,登录函数只有一个,如何同时处理100个??
—多任务编程
多个线程或多个进程来解决

多任务指同一时间执行多个任务,例如同时运行多个软件(QQ,微信等同时运行)
多任务最大好处:充分利用CPU资源,提高程序的执行效率

3、多任务形式

两种:并行or并发
所有程序运行都需要CPU进行处理

单核CPU需要同时运行下面四个程序:
在这里插入图片描述
并发:交替运行,因为交替的时间很短,感知不到切换(针对单核CPU)
运行进程A的前两行代码 – 进程C的前两行代码 – 进程B前两行 – 进程C的后两行代码 -。。。直到运行完

并行:针对多核CPU,给每个CPU安排一个执行的软件,多个内核并行才是真正的一起执行软件
但当程序超过CPU数量,还是会转化为并发
在这里插入图片描述

4、进程

进程是实现多任务的一种方式
多同一份代码,创建多个进程,就可以实现执行多次代码

一个正在运行的程序或者软件就是一个进程,它是操作系统进行资源分配的基础单位。没启动一个进程,操作系统会分配一定的运行资源保证进程的运行
栗子:公司可以理解为一个进程,公司提高办公资源,干活的员工可以理解为线程

一个程序运行后至少有一个进程,一个进程默认有一个线程,也可以创建多个线程,线程依附于进程里面,没有进程就没有线程

将进程复制三份,则,下面四个进程都是运行一样的代码。即这样就把同一份代码运行了4次,即解决了四个人同时登录的问题。100个人同时登录就复制100份

在这里插入图片描述
创建程序,就会分配空间,复制的时候也会重新分配空间

进程是python程序实现多任务的一种方式。方式:想要代码多次执行 – 将代码多次复制

5、多进程的使用

5.1 案例

def login():
	print('登录')

if __name__ =='__main__':
	login()
	login()
	login()
#这是多次函数的调用,一次进程里面多次调用方法
#导入多进程模块
import multiprocessing

def login():
	print('登录')

if __name__ =='__main__':
	login()
	login()
	#P大写
	p1 = multiprocessing.Process(target = login) #创建一个进程
	#括号里面一些参数group = None指定分组,target =None指定调用函数名
	#运行进程指定对应函数业务逻辑
	p1.start()
	#p2 = multiprocessing.Process(target = login)
	#p2.start() 多次

在这里插入图片描述
输出三个;两个login()+多任务p1.start()
多次调用的时间效率要比多进程低

两个login():
在这里插入图片描述
在一个进程里面,在多并发时是会跳转,所以损坏时间更多

p1.start()+p2.start():
两个程序代码,效率更高
在这里插入图片描述
多进程使用时注意:

  • multiprocessing.Process中P大写
  • multiprocessing.Process要写在if name ==‘main’:下

5.2 加参数

传参的两种方式:args 与kwargs

import multiprocessing

def login(name,password):
	print('名字:',name)
	print('密码:',password)
	print('登录')

if __name__ =='__main__':
	login()
	login()
	#P大写
	p1 = multiprocessing.Process(target = login,args=('python','1111111')) #创建一个进程
	#括号里面一些参数group = None指定分组,target =None指定调用函数名
	#args=(),kwargs={}给函数传递参数
	p1.start()
	p2 = multiprocessing.Process(target = login,kwargs={'name':'itcast','passsword':'22222222'})
	p2.start() 

在这里插入图片描述

5.3 指定进程名称

import multiprocessing

def login(name,password):
	print('名字:',name)
	print('密码:',password)
	print('登录')
	#获取进程名称
	print('进程名称:',multiprocessing.current_process().name)

if __name__ =='__main__':
	login()
	login()
	#P大写
	p1 = multiprocessing.Process(target = login,args=('python','1111111')name='p1') #创建一个进程
	#括号里面一些参数group = None指定分组,target =None指定调用函数名
	#args=(),kwargs={}给函数传递参数
	p1.start()
	p2 = multiprocessing.Process(target = login,kwargs={'name':'itcast','passsword':'22222222'},name='p2')
	p2.start() 

在这里插入图片描述
下一次可能先p2再p1,是cpu根据算法随机的,非固定

如果想要安装顺序运行?
需要用到进程等待,一个用完后再另一个
这样就不是并行并发了,通常我们都想要效率高–会用到并行并发

import multiprocessing

def login(name,password):
	print('名字:',name)
	print('密码:',password)
	print('登录')
	#获取进程名称
	print('进程名称:',multiprocessing.current_process().name)

if __name__ =='__main__':
	login()
	login()
	#P大写
	p1 = multiprocessing.Process(target = login,args=('python','1111111')name='p1') #创建一个进程
	#括号里面一些参数group = None指定分组,target =None指定调用函数名
	#args=(),kwargs={}给函数传递参数
	p2 = multiprocessing.Process(target = login,kwargs={'name':'itcast','passsword':'22222222'},name='p2')
	p1.start()
	p1.join()
	p2.start() 
	p2.join()
	#p1执行完后再p2

5.4 获取进程编号

当前文件–主进程,文件运行过程中产生的进程–子进程
os.getpid() --进程编号
os.getppid()–进程的父进程编号

import multiprocessing
import os
def login(name,password):
	print('名字:',name)
	print('密码:',password)
	print('登录')
	#获取进程名称
	print('进程名称:',multiprocessing.current_process().name)
	print('子进程:',os.getpid())
	print('子进程的父进程:',os.getppid())

if __name__ =='__main__':
	login()
	login()
	#P大写
	p1 = multiprocessing.Process(target = login,args=('python','1111111')name='p1') #创建一个进程
	#括号里面一些参数group = None指定分组,target =None指定调用函数名
	#args=(),kwargs={}给函数传递参数
	p2 = multiprocessing.Process(target = login,kwargs={'name':'itcast','passsword':'22222222'},name='p2')
	p1.start()
	p1.join()
	p2.start() 
	p2.join()
	#p1执行完后再p2
	#获取当前进程
	print('主进程:',os.getpid())

在这里插入图片描述
不同子进程对应不同编号

在这里插入图片描述

5.5 注意点

  1. 主进程需要在所有子进程全部执行完后才开始执行
  2. 进程之间不共享全局变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值