zoukankan      html  css  js  c++  java
  • python3多进程 进程池 协程并发

    一、进程

              我们电脑的应用程序,都是进程,进程是资源分配的单位。进程切换需要的资源最大,效率低。
            进程之间相互独立
            cpu密集的时候适合用多进程

    #多进程并发

    import multiprocessing
    from multiprocessing import Pool
    import time
    def test1():
        for i in range(10):
            time.sleep(1)
            print('test', i)
     
    def test2():
        for i in range(10):
            time.sleep(1)
            print('test', i)
     
    if __name__ == '__main__':
        p1 = multiprocessing.Process(target=test1)
        p2 = multiprocessing.Process(target=test2)
        p1.start()
        p2.start()

    #进程之间不共享

    import multiprocessing
    from multiprocessing import Pool
    import time
    import threading
    g_num = 0
    def test1():
        global g_num
        for i in range(10):
            g_num += 1
    def test2():
        print(g_num)
    if __name__ == '__main__':
        p1 = multiprocessing.Process(target=test1)
        p2 = multiprocessing.Process(target=test2)
        p1.start()
        p1.join()
        p2.start()
    结果是 0 
     

    二、进程池

            python中,进程池内部会维护一个进程序列,当需要时,程序会去进程池中获取一个进程,如果进程池序列中没有可供使用的进程,那么程序就会等待,直到进程池中有可用的进程为止。

    #进程池实现并发

    import multiprocessing
    from multiprocessing import Pool
    import time
    import threading
    g_num = 0
    def test1():
        for i in range(10):
            time.sleep(1)
            print('test1',i)
    def test2():
        for i in range(10):
            time.sleep(1)
            print('test2',i)
     
    if __name__ == '__main__':
        pool = Pool(2)    # 允许进程池里同时放入2个进程 其他多余的进程处于挂起状态
        pool.apply_async(test1)      
        pool.apply_async(test2)
        pool.close()  # close() 必须在join()前被调用
        pool.join()    # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。

    join() 方法实现进程间的同步,等待所有进程退出。 close() 用来阻止多余的进程涌入进程池 Pool 造成进程阻塞。 apply_async()本身就可以返回被进程调用的函 数的返回值 

     

    三、 协程:

            协程相对独立,有自己的上下文,但其切换由自己控制,由当前协程切换到其他协程由协程来控制。而线程的切换由系统控制。  协程切换需要的资源很小,效率高
      多进程、多线程根据cpu核数不一样可能是并行的,但是协程在一个线程中

    #协程,自动切换(可以在test2sleep的时候切换去执行test1)

    import gevent,time
    from gevent import monkey    
    monkey.patch_all()   #gevent三行放在其他所有import语句之前可以避免出现警告或者报错信息,导致程序不能正常运行
    def test1():
        for i in range(10):
            time.sleep(1)
            print('test1',1)
     
    def test2():
        for i in range(10):
            time.sleep(2)
            print('test2',2)
    g1 = gevent.spawn(test1)
    g2 = gevent.spawn(test2)
    g1.join()
    g2.join()
     
  • 相关阅读:
    uploadify插件的功能应用
    dropify插件的字符串
    VCC、VDD和VSS
    Bootloader升级方式一————擦、写flash在RAM中运行
    Can DBC文件翻译
    CANdbc编辑器的下载和入门介绍
    CAN协议,系统结构和帧结构
    数据帧
    自动驾驶技术之——无人驾驶中的CAN总线
    can物理信号-----------显性和隐性
  • 原文地址:https://www.cnblogs.com/heiguu/p/10056798.html
Copyright © 2011-2022 走看看