进程

一. 进程

现代操作系统(windows Mac os x Linux unix ) 都支持多任务

什么叫做多任务:
操作系统同时可以执行多个任务执行
单核系统是怎么实现多任务:

单核cpu实现多任务原理: 操作系统轮流让各个任务交替执行

例如: QQ执行2秒 切换到微信 执行2秒 在切换到微博.....

任务反复执行下去 但是cpu调用太快
导致我们感觉就执行所有任务在同时执行一样

多核系统 实现的原理是在单核之上

并发: 看上去一起执行,任务数多于cpu核心数
并行:真正一起执行 任务数小于等于cpu数

实现多任务的方式:
1. 多进程模式
2. 多线程模式
3.协程模式
4. 多进程+多线程模式

 进程概念

对系统而言每一个程序就是一个进程

进程是系统中程序执行和资源分配的基本单位

每一个进程都有自己的数据段 代码段 和堆栈段

单任务进程

 

from time import sleep

def run():
    while True:
      print("Lover 哈哈哈哈哈哈哈哈")

      sleep(1.2)
    
# 只执行这一个任务   单任务
if __name__== "__main__":

    while True:
      print("girl 啦啦啦啦啦啦啦啦")
      sleep(1)

# 不会执行到run方法
run()

# girl 啦啦啦啦啦啦啦啦
# girl 啦啦啦啦啦啦啦啦
# girl 啦啦啦啦啦啦啦啦
# girl 啦啦啦啦啦啦啦啦

多任务进程

# 多进程
"""multiprocessing 库
是一个跨平台版本多进程模块 提供了一个Process类来代表一个进程对象
"""
from multiprocessing import Process
from time import sleep

def run():
    while True:
      print("Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111")
      sleep(1.2)
    
# 只执行这一个任务   单任务
if __name__== "__main__":

    print("main是主(父)进程启动")

    # 01 创建进程 子进程
    #    target 说明进程执行的指定代码(函数)
    p=Process(target=run)
    #02  启动进程
    p.start()
    while True:
      print("girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000")
      sleep(1)


# irl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 

多任务进程子进程传参

# 多进程
"""multiprocessing 库
是一个跨平台版本多进程模块 提供了一个Process类来代表一个进程对象
"""
from multiprocessing import Process
from time import sleep

# 子进程需要执行代码
def run(str):
    while True:
      print("Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111"+str)

      sleep(1.2)
   
if __name__== "__main__":

    print("main是主(父)进程启动")
    # 01 创建进程 子进程
    #    target 说明进程执行的指定代码(函数)
    p=Process(target=run,args=("my is 张三丰来了",))
    #02  启动进程
    p.start()
    while True:
      print("girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000")
      sleep(1)


//main是主(父)进程启动
# irl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000

多任务进程子进程传参

# 多进程
"""multiprocessing 库

是一个跨平台版本多进程模块 提供了一个Process类来代表一个进程对象
"""
from multiprocessing import Process
from time import sleep
import os

# 子进程需要执行代码
def run(str):
    while True:
      # os.getpid()  获取当前进程的id号
      # os.getppid() 获取当前进程的父进程id号
      print("Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111"+str,os.getpid(),os.getppid()) 
   
if __name__== "__main__":

    print("main是主(父)进程启动",os.getpid())  # 7124


    # 01 创建进程 子进程
    #    target 说明进程执行的指定代码(函数)
    p=Process(target=run,args=("my is 张三丰来了",))
    #02  启动进程
    p.start()


    while True:
      print("girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000")
      sleep(1)

# main是主(父)进程启动 5372
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了 7148 5372
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了 7148 5372
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了 7148 5372
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了 7148 5372
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了 7148 5372
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了 7148 5372
# girl 啦啦啦啦啦啦啦啦000000000000000000000000000000000000000
# Lover 哈哈哈哈哈哈哈哈1111111111111111111111111111111my is 张三丰来了 7148 5372

父子进程先后顺序

# 多进程
"""multiprocessing 库

是一个跨平台版本多进程模块 提供了一个Process类来代表一个进程对象
"""
from multiprocessing import Process
from time import sleep
import os

# 子进程需要执行代码
def run(str):
      print("子进程启动了") 
      sleep(3)
      print("子进程结束")

if __name__== "__main__":

    print("main是主(父)进程启动....")  


    # 01 创建进程 子进程
    #    target 说明进程执行的指定代码(函数)
    p=Process(target=run,args=("nice",))
    #02  启动进程
   
    #父进程的结束不能影响子进程 让父进程等待子进程结束在执行父进程
    p.start()
    print("父进程结束....")
    sleep(1)

# main是主(父)进程启动....
# 父进程结束....
# 子进程启动了
# 子进程结束

父子进程先后顺序

# 多进程
"""multiprocessing 库

是一个跨平台版本多进程模块 提供了一个Process类来代表一个进程对象
"""
from multiprocessing import Process
from time import sleep
import os

# 子进程需要执行代码
def run(str):

      print("子进程启动了") 
      sleep(3)
      print("子进程结束")

if __name__== "__main__":

    print("main是主(父)进程启动....")  


    # 01 创建进程 子进程
    #    target 说明进程执行的指定代码(函数)
    p=Process(target=run,args=("nice",))
    #02  启动进程
   
    #父进程的结束不能影响子进程 让父进程等待子进程结束在执行父进程
    p.start()
    p.join()
    print("父进程结束....")

    sleep(1)

# main是主(父)进程启动....
# 子进程启动了
# 子进程结束
# 父进程结束....

全局变量在多个进程中不能共享

# 多进程
"""multiprocessing 库

是一个跨平台版本多进程模块 提供了一个Process类来代表一个进程对象
"""
from multiprocessing import Process
from time import sleep
import os

num=100

# 说明子进程和父进程用的num是完全不同的   是两个完全不同的变量
# 
def run():

     print("子进程开始")
      
     global num            #global 表示使用全局变量
     num+=1
     print(num)
     print("子进程结束")

if __name__=="__main__":

     print("父进程开始")

     p=Process(target=run)

     p.start()
     p.join()
     print("父进程结束---",num)

# 在子进程中修改全局变量对父进程中的全局变量没有影响
# 在创建子进程时对全局变量做了个备份  
# 在父进程和子进程中的num是两个完全不同的变量

"""
父进程开始
子进程开始
101
子进程结束
父进程结束--- 100"""

全局变量在多个进程中不能共享

# 多进程
"""multiprocessing 库

是一个跨平台版本多进程模块 提供了一个Process类来代表一个进程对象
"""
from multiprocessing import Process
from time import sleep
import os
num=100

# 说明子进程和父进程用的num是完全不同的   是两个完全不同的变量
# 
def run():
     print("子进程开始")
     
     # global num            #global 表示使用全局变量
     num=100  # 相当与 在这里定义一个变量
     num+=1
     print(num)
     print("子进程结束")

if __name__=="__main__":

     print("父进程开始")

     p=Process(target=run)

     p.start()
     p.join()
     print("父进程结束---",num)

# 在子进程中修改全局变量对父进程中的全局变量没有影响
# 在创建子进程时对全局变量做了个备份  
# 在父进程和子进程中的num是两个完全不同的变量

"""注意:
进程是系统中程序执行和资源分配的基本单位

每一个进程都有自己的数据段  代码段  和堆栈段"""

"""
父进程开始
子进程开始
101
子进程结束
父进程结束--- 100"""

启动多个进程

import os,time,random
from multiprocessing import Pool   # 多进程就用Pool  (进程池)


def run(name):

    print("子进程启动22222",name,getpid())

    print("子进程程结束2222",name,getpid())

if __name__ == '__main__':

    print("父进程启动11111")

    # 01 创建多个进程
    #     进程池
    #      表示可以同时执行进程数量
    #      Pool默认大小是cpu核心数
    pp=Pool(2)
    for i in range(5):
        # 02 创建进程 放入进程池统一管理
        pp.apply_async(run,args=(i,))
        
#apply 阻塞       同步方法
# apply_async  阻塞     异步方法

# 注意:在调用join之前必须先调用close 调用close之后就不能再继续添加新的进程了
pp.close()
#注意: 是进程池对象调用join会等待进程池中所有的子进程结束完毕再去执行父进程
pp.join()
print("父进程结束11111")

启动多个进程 (2)

# 多进程
"""multiprocessing 库

是一个跨平台版本多进程模块 提供了一个Process类来代表一个进程对象
"""
from multiprocessing import Pool   #  使用多进程
import os ,time ,random



def run(name):
     print("子进程启动--%s"%(name,os.getpid()))
     # print(name,os.getpid())
     start=time.time()
     time.sleep(random.choiec([1,2,3]))
     end=time.time()
     print("子进程%d结束--%s--耗时%2.f"%(name,os.getpid(),end-start))
     # print(name,os.getpid(),end-start)
     # 
if __name__=="__main__":

  print("父进程启动......................")

   # 01创建多进程
   #    进程池
   # Pool()  默认是大小cpu核心数   
  pp=Pool(2)     #表示可以同时执行的进程数量

  for i in range(3):  # 创建3个进程
        # 创建进程,放入进程池统一管理
        pp.apply_async(run,args=(i,))

   # 在调用join之前必须先调用close调用close之后就不能再继续添加新的进程了
  pp.close()
   # 进程池对象调用join 会等待进程池中所有的子进程结束完毕再去执行父进程
  pp.join()
  print("父进程结束......................")

拷贝文件

import os,time
from multiprocessing import Pool

# 实现文件拷贝
def copyFile(rPath,wPath):
    fr=open(rPath,"rb")
    fw=open(wPath,"wb")
    context=fr.read()
    fw.write(context)
    fr.close()
    fw.close()

path=r"E:\前端资料\ajax的jquery案例\111"

toPath=r"E:\Studypython\线程和进程\多任务管理\1"

# 读取path下所有文件
fileList=os.listdir(path)


start=time.time()

# 处理每一个文件
for fileName in fileList:

  copyFile(os.path.join(path,fileName),os.path.join(toPath,fileName))

end=time.time()
a=end-start

print("总耗时为:",a)

多进程拷贝文件

import os,time
from multiprocessing import Pool

# 实现文件拷贝
def copyFile(rPath,wPath):
    fr=open(rPath,"rb")
    fw=open(wPath,"wb")
    context=fr.read()
    fw.write(context)
    fr.close()
    fw.close()

path=r"E:\1\jquery的ajax实现跨域jsonp"

toPath=r"E:\Studypython\线程和进程\多任务管理\2"

if __name__ == '__main__':
    
  # 读取path下所有文件
    fileList=os.listdir(path)

    start=time.time()
    pp=Pool(2)
    for fileName in fileList:
       pp.apply_async(copyFile,args=(os.path.join(path,fileName),os.path.join(toPath,fileName)))
    pp.close()
    pp.join()
    end=time.time()
    b=end-start
    print(" 总耗时:",b)

进程间的通讯

import os,time
from multiprocessing import Process,Queue

def write(q):
    print("启动写子进程%s"%(os.getpid()))
    for chr in ["A","B","C","D"]:
        q.put(chr)
        time.sleep(1)
    print("结束写子进程%s"%(os.getpid()))

def read(q):
    print("启动读子进程%s"%(os.getpid()))
    while True:
       value=q.get(True)
       print("value="+value)
    print("结束读子进程%s"%(os.getpid()))

if __name__ == '__main__':
   # 父进程创建队列  并传递给子进程
     q=Queue()
     pw=Process(target=write,args=(q,))
     pr=Process(target=read,args=(q,))
     pw.start()
     pr.start()
     pw.join()

     # pr进程里是个死循环 无法等待其结束 只能强行结束
     pr.terminate()
     print("父进程结束")
     
# 启动写子进程3004
# 启动读子进程2612
# value=A
# value=B
# value=C
# value=D
# 结束写子进程3004
# 父进程结束

 

posted @ 2019-01-14 14:00  Loversuperme  阅读(142)  评论(0编辑  收藏  举报