zoukankan      html  css  js  c++  java
  • Python多进程、多线程及各自的适用场景

    多线程与多进程的应用场景不一样:
    1、线程的创建开销小、由于GIL的存在,无法真正并行,适合GUI、网络通信、文件读写IO密集型场景;
    2、进程的创建开销大,可以充分利用多个CPU实现并行,适合计算量比较大(比如单个函数执行需要几分钟、几十分钟以上),且无需IO(简单地说就是数据已经在内存中,不需要读取磁盘、网络通信)的场景。
    3、多线程、多进程都不适合的场景:基本不涉及IO或只读取一次文件这种,且计算量不大,单线程短时间就能结束(一两秒左右)的情况下,单进程单线程是最好的。

    我自己做过对比实验,这种情况下单进程>多线程>>多进程,实际测试结果:单线程0.98s,4个线程1.03s,4个进程1.6s。

    原因在于创建线程、进程的时间额外开销超过了任务本身的计算时间。

    4、实现多线程的方式:threading.Thread()、线程池concurrent.futures.ThreadPoolExecutor
    5、实现多进程的方式:multiprocessing.Process、进程池concurrent.futures.ProcessPoolExecutor
    6、多线程实现互斥:lock=threading.Lock(),lock.acquire(),访问共享变量,lock.release(),
    7、线程之间的数据共享:多个线程共用一个普通变量作为共享变量就可以,因为多线程共享同一个进程的内存空间。
    8、多进程实现互斥:lock=multiprocessing.Manager().Lock(),lock.acquire(),访问共享变量lock.release(),
    9、进程之间的数据共享:普通变量不能用作共享变量(因为普通变量属于宿主进程空间,不属于新创建的进程们,存在隔离),必须使用multiprocessing.Manager()提供的数据类型。

    例如:

    list_=Manager().list() #用类似Python的普通list,可以append,但不能直接取值,需要先用list(var)强制转为普通list
    dic_=Manager().dict(), #类似普通的dict
    v_=Manager().Value(typecode,value),#单个变量,typecode
    array_=Manager().Array(typecode,sequence) #数组

     10、进程之间通信的方式:pipe、queue

  • 相关阅读:
    Ftp、Ftps与Sftp之间的区别
    Previous Workflow Versions in Nintex Workflow
    Span<T>
    .NET Core 2.0及.NET Standard 2.0 Description
    Announcing Windows Template Studio in UWP
    安装.Net Standard 2.0, Impressive
    SQL 给视图赋权限
    Visual Studio for Mac中的ASP.NET Core
    How the Microsoft Bot Framework Changed Where My Friends and I Eat: Part 1
    用于Azure功能的Visual Studio 2017工具
  • 原文地址:https://www.cnblogs.com/aaronhoo/p/14087676.html
Copyright © 2011-2022 走看看