python多进程笔记

什么是操作系统?
    操作系统就是位于硬件与软件之间的控制程序
    作用:
        1,将硬件的复杂操作封装成简单的接口
        2,将程序之间的对计算机资源的竞争变得有序


什么是进程?
    进程就是一个程序的运行的过程

串行?
    串行就是一个任务完完整整的运行完毕才能执行下一个任务


并发:
    多个任务看起来是同时运行的单核就可以实现并发


并行:
    多个任务是真正意义上的同时运行,只有多核才可以实现并行


多道技术
    背景:想要在单核的情况下实现并发,
    并发实现的本质:切换+保存
    1,空间上的复用,多个任务占用一个内存条,但是内存是彼此隔离的而且是物理层的
    2,时间上的复用,多个任务之间同用一个CPU
        时间上的切换分为两种切换,
        1,io切换
        2,占用cpu时间过长
        3,优先级更高的



多进程的简单基础 什么是多进程,进程与程序之间的差别,
    进程是一个正在运行的程序,而程序只是一个存放在硬盘上的一堆文件,进程分为并发,并行,并发就是伪并行,是解决二代计算机与三代计算机的串行程序的问题,
    由于只是单核,因此在执行程序的时候会在多个进程之间切换,切换时分为io与程序的cpu占来切换进程,当多核执行多个进程时,假如计算机有4个核,那么每次只能同时执行4个进程,当遇到
    io操作与占用大量cpu的资源的进程时会自动将cpu切换到另外一个空闲的进程当中,进程的状态分为三种,  1,阻塞  2,运行 3,就绪

实现多线程的模块,
    使用multiprocess模块来声明一个线程,
        方式一,
            from multiprosess import Process
            def run(参数1,参数2,参数3,.......):
                需要执行得代码,。。。。


            if __name__ == '__main__':
                process = Process(target=需要执行的函数(即需要执行的代码),(参数,必须是元组的形式))
                process.start()  该方法是向操作系统来发起请求来执行一个建立一个进程
                process.alive()   查看进程是否还存活
                process.join()   父进程等待进子程执行完毕后才会执行下一个语句,通常使用与同步的概念,
                os模块当中有getpid()方法  获取一个进程的pid,   os.getppid()获取父进程的pid


        方式二,
            from multiprocess import Process
            class process(Process):
                def __init__(self,name):
                    self.name = name
                    super().__init__(name)

                def run(self,参数1,参数2,参数3.。。。。):
                    需要多进程中执行代码块

            if __name__ == '__main__':
                pro = process(进程名)在声明的时候会自动调用自定义类的__init__方法
                pro.start(参数)会自动的调用run方法
                pro.terminate()调用该函数来手动的释放进程,



        在win下需要将多进程对象放入main方法中,是因为在win上多进程的实现上(空间上的隔离)    进程需要的数据是import导入过来的,首先声明一个进程的时候会先创建一个名称空间,然后将当前声明该进程的文件中的数据
        通过import的方式来导入到新建进程的名称空间中,假设声明进程没有放到到main方法中  (import 导模块时会先运行模块中的内容,然后将产生的变量名,引用,与字面变量值放入当前的模块名称空间)
        就会发生循环导入并且提示错误

        在win平台上的错误提示
        RuntimeError:
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.

僵尸进程
    僵尸进程就是进程运行完毕之后残留的pid等日志信息,(父进程不知道什么时候子进程会运行完毕,这个时候就不能将进程的信息完全回收,)僵尸进程就是一种数据结构,虽然对内存,cpu不占用,但是占用大量的pid号
    当系统中存在大量的僵尸进程无法回收的时候在运行程序新建进程,就没有pid号来使用,实际上僵尸进程的大量产生是由于,父进程一直不回收子进程,父进程也不结束,这时的僵尸进程就大量的残存,系统也不会自动的去回收
    就导致系统新建进程失败,系统运行卡顿

孤儿进程:
    在正常情况下,父进程会等待子进程的运行完毕,再去回收子进程,假如子进程没有运行完毕,父进程就已经运行完毕被回收,那么这些子进程就会成为孤儿进程,孤儿进程本身是无害的,孤儿进程运行完毕时会自动的交给系统来回收
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值