zoukankan      html  css  js  c++  java
  • ~~并发编程(三):开启进程~~

    进击の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('我是主进程... ...')
    
    

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

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


    *****
    *****
  • 相关阅读:
    【转载】要有一流的科研 也要有一流的教学(在2011年教师节复旦大学青年教师座谈会上的发言)
    【转载】谢启鸿老师访谈录之一(10级,撰稿人:侯灵子)
    【转载】谢启鸿老师访谈录之二(12级,撰稿人:陈筠臻)
    [问题2014S15] 解答
    [问题2014S14] 解答
    判断是否关注了微信公众号 subscribe 0=未关注 1=已关注
    PHP获取今天、昨天、明天的日期
    lnmp安装fileinfo扩展
    Linux kill和kill-9区别
    单列索引、多列索引和最左前缀原则
  • 原文地址:https://www.cnblogs.com/jevious/p/11402249.html
Copyright © 2011-2022 走看看