• 多任务处理--多线程、多进程、协程


    1.多线程

    1)特点:

    线程的并发是利用cpu上下文的切换(是并发,不是并行)

    多线程执行的顺序是无序的

    多线程共享全局变量

    线程是继承在进程里的,没有进程就没有线程

    GIL全局解释器锁

    只要在进行耗时的IO操作的时候,能释放GIL,所以只要在IO密集型的代码里,用多线程就很合适

    2)多任务处理实例

    import threading
    
    global_num = 0
    
    lock = threading.Lock()
    
    def test1():
    
        global global_num
    
        lock.acquire() 保证在该进程执行期间其他进程无法调用num变量
    
        for i in range(1000000):
    
            global_num += 1
    
        lock.release()
    
     
    
    def test2():
    
        global global_num
    
        lock.acquire()
    
        for i in range(1000000):
    
            global_num += 1
    
        lock.release()
    
     
    
    t1 = threading.Thread(target=test1)
    
    t2 = threading.Thread(target=test2)
    
    t1.start()
    
    t2.start()
    
    t1.join() 保证两个子进程执行完成后再执行主进程
    
    t2.join()
    
    print(global_num)
    
     
    

    输出结果:

    2000000

    2.多进程

    1)特点

    一个程序运行起来之后,代码+用到的资源称之为进程,它是操作系统分配资源的基本单位,不仅可以通过线程完成多任务,进程也是可以的

    进程之间是相互独立的

    cpu密集的时候适合用多进程

    进程之间的资源不共享

    2)多任务处理实例

    import time
    
    import threading
    
    g_num = 0
    
    def edit():
    
        global g_num
    
        for i in range(10):
    
            g_num += 1
    
    def reader():
    
        print(g_num)
    
     
    
    if __name__ == '__main__':
    
        p1 = multiprocessing.Process(target=edit)
    
        p2 = multiprocessing.Process(target=reader())
    
        p1.start()
    
        p2.start()
    
        p1.join()
    
        p2.join()
    

    输出结果:

    10

    0

    3)进程池

    import multiprocessing
    
    import time
    
    from multiprocessing import Pool
    
     
    
    def test1():
    
        for i in range(10):
    
            time.sleep(1)
    
            print('task1',i)
    
     
    
    def test2():
    
        for i in range(10):
    
            time.sleep(1)
    
            print('task2',i)
    
    if __name__ == '__main__':
    
        pool = Pool(2)允许最大同时执行的进程数
    
        pool.apply_async(test1)
    
        pool.apply_async(test2)
    
        pool.close()
    
        pool.join()
    

    输出结果:

    task1 0

    task2 0

    task1 1

    task2 1

    task1 2

    task2 2

    task1 3

    task2 3

    3.协程

    1)特点

    协程:也叫微线程,协程是在一个线程里面的

    异步IO:遇到io请求就切换

    先有进程,再有线程,才能有协程

    2)多任务处理实例

    import time
    
    import gevent
    
    from gevent import monkey
    
    monkey.patch_all()
    
     
    
    def test1(n):
    
        for i in range(n):
    
            # gevent.sleep(1)
    
            time.sleep(1)
    
            print('task1',i)
    
     
    
    def test2(n):
    
        for i in range(n):
    
            # gevent.sleep(1)
    
            time.sleep(1)
    
            print('task2',i)
    
     
    
    g1 = gevent.spawn(test1,10)
    
    g2 = gevent.spawn(test2,10)
    
    g1.join()
    
    g2.join()
    

    输出结果:

    task1 0

    task2 0

    task1 1

    task2 1

    task1 2

    task2 2

    task1 3

    task2 3

  • 相关阅读:
    Joda-Time 简介
    SimpleDateFormat 的线程安全问题
    SimpleDateFormat 的线程安全问题
    自定义类加载器
    自定义类加载器
    javap与 i++,++i
    javap与 i++,++i
    I/O模型
    I/O模型
    逻辑运算符(上) ---没用
  • 原文地址:https://www.cnblogs.com/Agnostida-Trilobita/p/11060513.html
Copyright © 2020-2023  润新知