并发:
计算机一个内核处理多个任务,其实就是内核在任务间不停的切换,达到好像多个任务同时在执行,实际上每个时刻只有一个任务在执行
并行:
多个任务利用计算机的多核同时执行,达到并行的效果
进程:
进程是程序在计算机种运行,代表是的是程序运行的一个状态
进程的状态:
就绪态:进程具备执行条件,等待cpu分配资源
运行态:进程占用cpu时间片
等待态:进程暂停运行,让出时间片
相关的进程函数
os.getpid()
os.getppid()
os.exit()
sys.exit()
python实现多进程:
------基于fork实现: windows上不支持。只支持linux和unix系统
注意。如果os.fork()创建子进程成功。那么会将父进程的内存空间和代码复制一份给子进程。所以下例中,a变量和print(os.getpid())语句也带到了子进程中,所以会打印两次print(os.getpid())
import os
from time import sleep
pid = os.fork() #开启子进程,并将自己的内存空间和代码全部复制给子进程
a = 1 #在当前继承将a=1放到内存空间
print(os.getpid())
if pid < 0:
#pid<0,进程创建失败
print('create process failed')
elif pid == 0:
#子进程走这里
print('this is new process')
print('a=',a)
else:
#父进程走这里
print('tihs is old process')
---基于multiprocessing创建进程
from multiprocessing import Process
--Process()
功能 : 创建进程对象
参数 : target 绑定要执行的目标函数
args 元组,用于给target函数位置传参
kwargs 字典,给target函数键值传参
'''
multiprocessing创建进程
1.编写进程函数
2.生成进程对象
3.启动进程
4.回收进程
'''
from multiprocessing import Process
from time import sleep
# 有参数的进程函数
def worker(sec,name):
for i in range(3):
sleep(sec)
print("I'm %s"%name)
print("I'm working...")
# 创建进程对象,通过args 给函数位置传参
p = Process(target=worker,args=(2,),
kwargs={'name':'Baron'})
#启动子进程
p.start() #其中2表示,只阻塞2秒,2秒过后,子进程自动结束
#回收子进程
p.join()
---如何创建多个子进程
from multiprocessing import Process
from time import sleep
import os
def th1():
sleep(3)
print("吃饭")
print(os.getppid(),'--',os.getpid())
def th2():
sleep(2)
print("睡觉")
print(os.getppid(),'--',os.getpid())
def th3():
sleep(4)
print("打豆豆")
print(os.getppid(),'--',os.getpid())
things = [th1,th2,th3]
jobs = []
for th in things:
p = Process(target=th)
jobs.append(p) # 对进程对象进行存储
p.start()
# [i.join() for i in jobs]
# 一起回收
for i in jobs:
i.join()
--进程池
进程的创建和销毁的过程会消耗的资源较多,如果任务量很多,每个任务又是在很短时间内完成,需要频繁创建进程和销毁,因此消耗大量的计算机资源,所以我们可以创建一定数量的进程来处理事件,事件处理完进 程不退出而是继续处理其他事件,直到所有事件全都处理完毕统一销毁。增加进程的重复利用,降低资源消耗。
from multiprocessing import Pool
from time import sleep,ctime
def worker(msg):
sleep(3)
print(ctime(),'--',msg)
#创建进程池
p = Pool(3)
#向进程池队列添加事件
for i in range(5):
msg = 'Tedu %d'%i
p.apply_async(func=worker,args=(msg,))
p.close()
p.join()
#上述中,只开启三个进程的进程池,但在进程池中需要执行5个任务,
# 所以进程池一次执行三个,但是当这三个进程执行完成后,进程并不销毁,而是给剩下的两个任务执行