用multiprocessing模块创建进程, 创建自定以进程 ,和进程池技术

  • olmultiprocessing 模块创建进程

    1.需要将要执行的事情封装为函数
    2.使用moltiprocessing模块中Process类创建进程对象
    3.通过对象属性设置和Process的初始化函数对进程进行设置,绑定要执行的函数
    4.启动进程,会自动执行进程绑定的函数
    5.完成进程的回收

Process()
    功能:创建进程对象
    参数:name 进程名称  Process-1
             target 绑定函数
             args 元组 给target函数按照位置传参
             kwargs 字典 给target函数按照键值对传参

p.start()
    功能:启动进程
    *target函数会自动执行,此时进程真正被创建
p.join([timeout])
    功能:等待回收子进程
    参数:超时时间

    *使用multiprocessing创建子进程,同样子进程复制父进程的全部代码段
    父子进程各自执行互不影响,父子进程有各自的运行空间

    *如果不使用join回收子进程则子进程退出后会成为僵尸进程

    *使用multiprocessing创建子进程往往父进程只是用来创建进程回收进程
注意:
    1.如果子进程从父进程拷贝对象,对象和网络或者文件相关联,那么父子进程会使用同一套对象属性,相互有一定的关联性
    2.如果在子进程中单独创建对象,则和父进程完全没有关联

# process1.py

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 ..      ..")
p = Process(target = worker, args = (1, 'zhuli'), name = 'shuijun')

p.start()
print('Process name:', p.name)  # 进程名称
print('Process PID', p.pid)     # 获取进程pid号
print('Process is alive:', p.is_alive())  # 进程alive情况
p.join()


#  结果为:
#  Process name: shuijun
#  Process PID 60903
#  Process is alive: True
#  I'm zhuli
#  I'm working ....
#  I'm  zhuli
#  I'm working ....
#  I'm zhuli
#  I'm working ....

Process进程对象属性

    p.start()         启动进程
    p.join()           回收子进程

    p.is_alive()    判断进程的生命周期状态,处于生命周期得到True否则返回False
    p.name          进程名称  默认为Process-1
    p.pid              进程的PID号
    p.daemon
        默认状态False  主进程退出不会影响子进程执行
        如果设置为True,则子进程会随着主进程结束而结束

        *要在srtart 前设置
        *一般不和join一起使用

  • 创建自定义进程类

    1.继承Process
    2.编写自己的__init__,同时加载父类的__init__方法
    3.重写run方法,通过生成的对象调用start自动运行

# clock.py
from multiprocessing import Process
import time

class ClockProcess(Process):
    def __init__(self,value):
        self.value = value
        super().__init__()

    # 重写run方法
    def run(self):
        for i in range(5):
            print('The time is {}'.format(time.ctime()))
            time.sleep(self.value)


# 创建自定义进程类的对象
p = ClockProcess(2)
# 自动调用run
p.start()
p.join()

多进程
    优点:可以使用计算机多核,进行任务的并发执行,提高执行效率
        空间独立,数据安全
        运行不受其他进程影响,创建方便
    缺点:进程的创建和消耗的系统资源较多

进程池技术
    产生原因:如果有大量任务需要多进程完成,则可能需要频繁的创建删除进程,给
                     计算机带来较多的资源消耗

    原理:创建适当的进程放入进程池,用来处理待处理事件,处理完毕之后进程不销毁,
             仍然在进程池中等待处理其他事件.进程的复用降低了资源的消耗

    使用方法:
        1.创建进程池,在池内放入适当的进程(4-8个)
        2.将事件加入到进程池等待队列
        3.事件不断取进程执行事件,直到所有事件执行完毕
        4.关闭进程池,回收进程

    Pool(process)
    功能:创建进程池对象
    参数:表示进程池中有多少个进程

    pool.apply_async(func,args,kwargs)
    功能:将事件放入到进程池队列
    参数:func      事件函数
             args       以元组形式给func传参
             kwargs  以字典形式给func传参
    返回值:返回一个代表进程池对象
    pool.close()
    功能:o闭进程池

    pool.join()
    功能:回收进程池


    pool.map(func,iter)
    功能:将要做的事件放入进程池
    参数:func 要执行的函数
             iter    迭代对象
    返回值: 返回事件函数的返回值列表

# pool.py
from multiprocessing import Pool
from time import sleep,ctime


def worker(msg):
    sleep(2)
    print(msg)
    return ctime()

# 创建进程池
pool = Pool(processes = 4)  # 创建4个进程池
result = []
for i in range(10):
    msg = 'hello %d' % i
    # 将事件放入进程池对列中等待执行
    r = pool.apply_async(func = worker, args = (msg,))
    result.append(r)
# 关闭进程池
pool.close()
# 回收进程池
pool.join()
for i in result:
    print(i.get())  #获取事件函数的返回值


# hello 0
# hello 1
# hello 3
# hello 2
# hello 6
# hello 5
# hello 4
# hello 7
# hello 8
# hello 9
# Thu Sep 13 20:01:00 2018
# Thu Sep 13 20:01:00 2018
# Thu Sep 13 20:01:00 2018
# Thu Sep 13 20:01:00 2018
# Thu Sep 13 20:01:02 2018
# Thu Sep 13 20:01:02 2018
# Thu Sep 13 20:01:02 2018
# Thu Sep 13 20:01:02 2018
# Thu Sep 13 20:01:04 2018
# Thu Sep 13 20:01:04 2018

 

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值