python-进程、线程、协程

异步I/O
参考文献1
参考文献2
参考文献3
python异步
协程
python-进程/线程
线程教学
python开启进程的两种方式

进程、线程、协程

**进程:**正在进行的一个过程或者说一个任务,执行任务的是CPU,一个程序在一个数据集上的一次动态执行过程。
程序是代码,进程是计算核心,一个程序可以开启多个进程。
进程结构:
程序-数据集-进程控制块(系统感知进程存在的唯一标识,用它控制和管理进程)
**线程:**进程的下级单位,操作系统中能够进行运算调度的最小单位
如:洗衣房有n个洗衣机,安排m个洗衣工,这洗衣房相当于一个进程,洗衣工相当于线程,一个进程可以有多个进程,而客户来洗洗衣服,相当于启动程序,可以让让洗衣房A洗T恤,让洗衣房B洗裤子,这就是同时运行多个进程。
**协程:**async和await,一个洗衣工同时操作n台洗衣机,根据设定的优先级进行操作,await可以执行中断操作,但只针对async(异步)函数

并发与并行

在客户看来都是同时运行的

  • 并发-伪并行(单CPU+多道)
    即有A、B、C三个任务,A执行一段事件cpu就去执行一会儿B,然后又执行一会儿C,在客户看来是同时运行的
  • 并行-真正的同时运行(多cpu实现,但同时每个核也可以结合多道技术)
    有四个核,六个任务,这样同一时间有四个任务被执行,假设分别被分配给了cpu1,cpu2,cpu3,cpu4,一旦任务1遇到I/O就被迫中断执行,此时任务5就拿到cpu1的时间片去执行,这就是单核下的多道技术,而一旦任务1的I/O结束了,操作系统会重新调用它(需知进程的调度、分配给哪个cpu运行,由操作系统说了算),可能被分 配给四个cpu中的任意一个去执行

进程的创建

进程依托于操作系统,有的操作系统只为一个程序设计,其开启时,所有进程都已存在,通用系统要能够同时跑很多程序,就需要创建和撤销进程的能力。
主要有4种手段
1、系统初始化(查看进程linux中用ps命令,windows中用任务管理器,前台进程负责与用户交互,后台运行的进程与用户无关,运行在后台并且只在需要时才唤醒的进程,称为守护进程,如电子邮件、web页面、新闻、打印)
2、一个进程在运行过程中开启了子进程(如nginx开启多进程,os.fork,subprocess.Popen等)
3、用户的交互式请求,而创建一个新进程(如用户双击暴风影音)
4、一个批处理作业的初始化(只在大型机的批处理系统中应用)

进程与线程的区别

1、运行方式不同
进程不单独执行,需要先开一个主线程;
同一个进程里的线程,是共享一块进程所占的内存空间;
2、关系
进程的第一个线程是主线程,主线程可以创建其它线程,其它线程也可以创建新线程;
线程间是平等的,windows进程间是平等的,unix有一个init根进程,组成树状结构;
进程有父子的区别,独立的内存空间,唯一标识符:pid
3、速度
启动:线程>进程
运行:线程=进程
内存:线程共享,进程独立
4、交互
父生子进程,内存空间复制一份,彼此独立,要想通讯需要通过一个中间代理(管道)来实现;
一个线程可以操控同级其它线程,但进程只能操控子进程;
**注:**使用CPython解析器的oython执行环境,因为加入了GIL(全局解释器锁),同一时刻只允许一个线程运行。

python的实例

进程

from multiprocessing import Process
import time
def task(name):
	print('%s is runnig'%name)
	time.sleep(3)
	print('%s is over'%name)
class MyProcess(Process):
	def run(self):
		print('hello bf girl')
		time.sleep(1)
		print('get out!')
		
if __name__=="__main__":
	#方式1
	#1创建一个对象
	p=Process(target=task,args=('jason',))
	#2 开启进程
	p.start()
	#方式2
	p=MyProcess()
	p.start()

线程

python3中不再推荐使用”thread“模块,且重命名为了”_thread“,推荐使用threading模块

import threading
import time
def funa(thread_name):
	print(thread_name)
	time.sleep(2)
def funb(thread_name):
	print(thread_name)
	time.sleep(2)
f1=threading.Thread(target=funa,args=('kris',))
f2=threading.Thread(target=funb,args=('wang',))
f1.setName('kkk')#修改线程名字
print(f1.getName())#获取线程名字
f1.setDaemon(True)#主线程结束后也跟着结束
f1.start()
f2.start()
f1.join()#阻塞其它线程直到完成
print('这是主线程所在')

协程

#异步函数,不能直接调用运行
#需要一个驱动函数
def run(coroutine):
	try:
		coroutine.send()
	except StopIteration as e:
		return e.value
async def funa():
	s=1
	for i in range(10):
		if i==5:
			await funb(s)#等funbz执行完再继续funa
		s=s+1
	print(s)
async def funb(s):
	s=s+2
run(funa())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值