zoukankan      html  css  js  c++  java
  • 多任务处理--多线程、多进程、协程

    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

  • 相关阅读:
    【python】带图片验证码的登录自动化实战
    【Python】输入一个整数N,求1到N个整数的十进制表示中某个字符出现的次数
    【Python】input()与sys.stdin()使用比较
    【Python】爬虫之使用etree进行xpath元素定位
    python:读取数据库+图片上增加文字
    H5介绍与测试设计
    【OpenCV-Python:实现人脸、人眼、嘴巴识别】实战(一)
    ASCII、Unicode、GBK和UTF-8字符编码的区别联系
    Python基础语法学习笔记
    Python基础知识符和操作符_学习笔记
  • 原文地址:https://www.cnblogs.com/Agnostida-Trilobita/p/11060513.html
Copyright © 2011-2022 走看看