~~并发编程(三):开启进程~~

进击のpython

*****

并发编程——开启进程


上一节说了那么多关于进程的东西,那这一节就尝试着自己开启一下进程

这一节我们可以尝试着使用multiprocessing模块开启进程

通过掌握multiprocessing模块开启进程的两种方式

是我们在后面的学习的基础,所以一定要好好看


multiprocessing模块

首先,由于语言特点,python的多线程没办法使用多核优势

所以说,但凡我们想要利用到多核的优势,在python中大部分都要用到多进程

基于python的模块多且广的优势,在多进程方面就有了multiprocessing这个模式进行支持

这个模块提供的功能众多:支持子进程等等,提供了Process,Queue,Pipe和Lock等组件

但是!这里需要强调一个问题就是:

与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内


Process类

class Process(object):
    def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
        self.name = ''
        self.daemon = False
        self.authkey = None
        self.exitcode = None
        self.ident = 0
        self.pid = 0
        self.sentinel = None

介绍一下参数:

group:参数未使用,值始终是None

target:表示调用对象,即子进程要执行的任务(就是塞进去一个你想执行的函数)

args:表示调用对象的位置参数元祖(就是对函数进行传参)

kwargs:表示调用对象的字典(就是对函数进行传参)

name:子进程的名字

介绍一下属性:

p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程

​ 当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程

​ 必须在p.start()之前设置
​ p.name:进程的名称
​ p.pid:进程的pid

    def run(self):
        pass

    def start(self):
        pass

    def terminate(self):
        pass

    def join(self, timeout=None):
        pass

    def is_alive(self):
        return False

接下来介绍一下方法:

p.start():启动进程,并调用该子进程中的p.run()

p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法

p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方 法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁

p.is_alive():如果p仍然运行,返回True

p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)

​ timeout是可选的超时时间


Process的使用

首先很重要的一点就是,在windows系统,进程的开启必须放到if name == 'main':的下面

第一种方法

from multiprocessing import Process


def func(name, *args, **kwargs):
    print(f'{name}执行!')
    pass


if __name__ == '__main__':
    p = Process(target=func, args=('子进程',))
    p.start()
    print('我是主进程... ...')

在主进程中创建一个子进程,用来执行函数func,并对函数进行传参

然后利用start进行声明子进程

第二种方法

from multiprocessing import Process


class Myprocess(Process):
    """这是Myprocess"""

    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        print(f'{self.name}执行!')


if __name__ == '__main__':
    p = Myprocess('子进程')
    p.start()
    print('我是主进程... ...')

这种方法用的太少了,就看一下了解一下就行

更多的还是第一种方法的使用


*****
*****
posted @ 2019-08-09 00:00  吃夏天的西瓜  阅读(646)  评论(0编辑  收藏  举报