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


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

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

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


    *****
    *****
  • 相关阅读:
    leetcode 122. Best Time to Buy and Sell Stock II
    leetcode 121. Best Time to Buy and Sell Stock
    python 集合(set)和字典(dictionary)的用法解析
    leetcode 53. Maximum Subarray
    leetcode 202. Happy Number
    leetcode 136.Single Number
    leetcode 703. Kth Largest Element in a Stream & c++ priority_queue & minHeap/maxHeap
    [leetcode]1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree
    正则表达式
    十种排序算法
  • 原文地址:https://www.cnblogs.com/jevious/p/11402249.html
Copyright © 2020-2023  润新知