zoukankan      html  css  js  c++  java
  • 进程

    1.概述

    (1)单核CPU实现多任务原理:操作系统轮流让各个任务交替执行,qq执行2us,切换到微信,再执行2us,再切换到陌陌执行2us。。。表面上是看,每个任务反复执行下去,但是CPU执行速度太快了,导致我们感觉就像所有任务都在同时执行一样。

    (2)多核CPU实现多任务原理:真正并行执行多任务只能在多核CPU上实现,但是因为任务数量远远多于CPU的核心的数量,所以操作系统也会自动把很多任务轮流调度到每个核心上执行

    (3)并发(concurrency)

    当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其他线程处于挂起状态,这种方式我们称之为并发

    (4)并行(parallelism)

    当系统有一个以上CPU时,则线程的操作有可能并非并发。当一个CPU执行一个线程时,另一个CPU执行另一个线程,两个线程互不抢占CPU资源,可以同时运行,我们称之为并行

    (5)实现多任务的方式

    • 多进程模式
    • 多线程模式
    • 协程

    进程 > 线程 > 协程

    一个进程中包含多个线程

    一个线程中包含多个协程

     2.进程

    import os
    from multiprocessing import Process
    from time import sleep
    
    
    def task1():
        while True:
            sleep(1)
            print('这是任务1。。。', os.getpid())
    
    
    def task2():
        while True:
            sleep(1)
            print('这是任务2。。。', os.getpid(), '-------', os.getppid())
    
    
    if __name__ == '__main__':
        print(os.getpid())
        # 子进程
        p = Process(target=task1, name='任务1')
        p.start()
        p = Process(target=task2, name='任务1')
        p.start()
    
        print('===========')

     

    创建进程的方法:

    from multiprocessing import Process

    process = Process(target=函数, name=进程的名字, args=(给函数传递的参数))

    process --- 对象

    对象调用方法:

    process.start()  --- 进程启动,并执行任务

    process.run()    --- 只是执行了任务,但是没有启动进程

    terminate() --- 终止进程

    使用terminate()函数

    from multiprocessing import Process
    from time import sleep
    
    
    def task1(s):
        while True:
            sleep(s)
            print('这是任务1...')
    
    
    def task2(s):
        while True:
            sleep(s)
            print('这是任务2...')
    
    
    number = 0
    
    if __name__ == '__main__':
        # 子进程
        p1 = Process(target=task1, args=(1, ))
        p1.start()
        p2 = Process(target=task2, args=(2, ))
        p2.start()
    
        while True:
            number += 1
            sleep(0.2)
            if number == 15:
                p1.terminate()
                p2.terminate()
                break
            else:
                print('----->number:', number)
    
        print('******************')
    

      

     这些代码的执行都是主进程完成的。

    进程的执行顺序是由CPU控制调度的

    多进程对于全局变量访问,在每一个全局变量里面都放了一个m变量,保证每个进程访问变量互不干扰

    from multiprocessing import Process
    from time import sleep
    
    m = 1
    def task1(s):
        global m
        while True:
            sleep(s)
            m += 1
            print('这是任务1...', m)
    
    
    def task2(s):
        global m
        while True:
            sleep(s)
            m += 1
            print('这是任务2...', m)
    
    
    if __name__ == '__main__':
        # 子进程
        p1 = Process(target=task1, args=(1, ))
        p1.start()
        p2 = Process(target=task2, args=(2, ))
        p2.start()
    
        while True:
            sleep(1)
            m += 1
            print('******************main:', m)
    

      

     注意:每个函数里面对全局变量的修改,都需要global m

    3.自定义进程

     为什么要自定义进程?

     在原来的task函数中如果想调用进程的方法,就需要自定义进程,继承父类Process,这样就可以把父类里面的东西都拿到子类里面

    from multiprocessing import Process
    
    
    class MyProcess(Process):
        def __init__(self, name):
            # 将父类里面所有的东西都拿过来
            super(MyProcess, self).__init__()
            self.name = name
    
        # 重写run方法
        def run(self):
            n = 1
            while True:
                print('{} -----> 自定义进程,n:{}'.format(n, self.name))
                n += 1
    
    
    if __name__ == '__main__':
        p = MyProcess('小米')
        # 只有调用start,就会调用自定义的run
        p.start()
    

      只要创建对象,就会去找init,再去找父类的init

    p.start()做两件事:1.开新的进程,2.调用run()

  • 相关阅读:
    27-Perl 进程管理
    26-Perl 包和模块
    25-Perl CGI编程
    YUM极速安装mariadb
    yum极速安装mysql5.7
    切换阿里yum镜像源
    mysql生成随机字符串函数
    Unable to locate value meta plugin of type (id)
    centos 挂载NTFS移动硬盘
    总有你要的编程书单(GitHub )
  • 原文地址:https://www.cnblogs.com/GumpYan/p/12830949.html
Copyright © 2011-2022 走看看