并发:

计算机一个内核处理多个任务,其实就是内核在任务间不停的切换,达到好像多个任务同时在执行,实际上每个时刻只有一个任务在执行

并行:

多个任务利用计算机的多核同时执行,达到并行的效果

 

进程:

进程是程序在计算机种运行,代表是的是程序运行的一个状态

 

进程的状态:

就绪态:进程具备执行条件,等待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')

ospf多进程双向重分发_ospf多进程双向重分发

 

 

 

 

 

---基于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()

 

ospf多进程双向重分发_进程池_02

---如何创建多个子进程

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个任务,
# 所以进程池一次执行三个,但是当这三个进程执行完成后,进程并不销毁,而是给剩下的两个任务执行

  

ospf多进程双向重分发_创建进程_03