• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Python多进程与多线程的使用场景详解

    前言

    Python多进程适用的场景:计算密集型(CPU密集型)任务

    Python多线程适用的场景:IO密集型任务

    计算密集型任务一般指需要做大量的逻辑运算,比如上亿次的加减乘除,使用多核CPU可以并发提高计算性能。

    IO密集型任务一般指输入输出型,比如文件的读取,或者网络的请求,这类场景一般会遇到IO阻塞,使用多核CPU来执行并不会有太高的性能提升。

    下面使用一台64核的虚拟机来执行任务,通过示例代码来区别它们,

    示例1:执行计算密集型任务,进行1亿次运算

    使用多进程

    from multiprocessing import Process
    import os, time
     
     
    # 计算密集型任务
    def work():
     res = 0
     for i in range(100 * 100 * 100 * 100): # 亿次运算
      res *= i
     
     
    if __name__ == "__main__":
     l = []
     print("本机为", os.cpu_count(), "核 CPU") # 本机为64核
     start = time.time()
     for i in range(4):
      p = Process(target=work) # 多进程
      l.append(p)
      p.start()
     for p in l:
      p.join()
     stop = time.time()
     print("计算密集型任务,多进程耗时 %s" % (stop - start))

    使用多线程

    from threading import Thread
    import os, time
     
     
    # 计算密集型任务
    def work():
     res = 0
     for i in range(100 * 100 * 100 * 100): # 亿次运算
      res *= i
     
     
    if __name__ == "__main__":
     l = []
     print("本机为", os.cpu_count(), "核 CPU") # 本机为64核
     start = time.time()
     for i in range(4):
      p = Thread(target=work) # 多线程
      l.append(p)
      p.start()
     for p in l:
      p.join()
     stop = time.time()
     print("计算密集型任务,多线程耗时 %s" % (stop - start))

    两段代码输出:

    本机为 64 核 CPU
    计算密集型任务,多进程耗时 6.864224672317505
     
    本机为 64 核 CPU
    计算密集型任务,多线程耗时 37.91042113304138

    说明:上述代码中,分别使用4个多进程和4个多线程去执行亿次运算,多进程耗时6.86s,多线程耗时37.91s,可见在计算密集型任务场景,使用多进程能大大提高效率。

    另外,当分别使用8个多进程和8个多线程去执行亿次运算时,耗时差距更大,输出如下:

    本机为 64 核 CPU
    计算密集型任务,多进程耗时 6.811635971069336
     
    本机为 64 核 CPU
    计算密集型任务,多线程耗时 113.53767895698547

    可见在64核的cpu机器下,同时使用8个多进程和4个多进程效率几乎一样。而使用多线程则就效率较慢。要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数

    示例2:400次,阻塞两秒,读取文件

    使用多进程(4核cpu)

    from multiprocessing import Process
    import os, time
     
     
    # I/0密集型任务
    def work():
     time.sleep(5) # 阻塞两秒
     
     
    if __name__ == "__main__":
     l = []
     print("本机为", os.cpu_count(), "核 CPU")
     start = time.time()
     for i in range(1000):
      p = Process(target=work) # 多进程
      l.append(p)
      p.start()
     for p in l:
      p.join()
     stop = time.time()
     print("I/0密集型任务,多进程耗时 %s" % (stop - start))

    使用多线程(4核cpu)

    from threading import Thread
    import os, time
     
     
    # I/0密集型任务
    def work():
     time.sleep(5) # 阻塞两秒
     
     
    if __name__ == "__main__":
     l = []
     print("本机为", os.cpu_count(), "核 CPU")
     start = time.time()
     
     for i in range(1000):
      p = Thread(target=work) # 多线程
      l.append(p)
      p.start()
     for p in l:
      p.join()
     stop = time.time()
     print("I/0密集型任务,多线程耗时 %s" % (stop - start))

    输出:

    本机为 64 核 CPU
    I/0密集型任务,多进程耗时 12.28218412399292
     
     
    本机为 64 核 CPU
    I/0密集型任务,多线程耗时 5.399136066436768

    说明:python的多线程有于GIL锁的存在,无论是多少核的cpu机器,也只能使用单核,从输出结果来看,对于IO密集型任务使用多线程比较占优。

    FAQ:执行多进程的io密集型任务时,报了一个错:

    OSError: [Errno 24] Too many open files

    原因:linux系统限制

    ulimit -n
    # 输出 1024

    解决:(临时提高系统限制,重启后失效)

    ulimit -n 10240

    总结

    到此这篇关于Python多进程与多线程使用场景的文章就介绍到这了,更多相关Python多进程与使用场景内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • 分析详解python多线程与多进程区别
    • 手把手带你了解python多进程,多线程
    • Python多进程共享numpy 数组的方法
    • 总结python多进程multiprocessing的相关知识
    • Python多线程与多进程相关知识总结
    • python实现多进程并发控制Semaphore与互斥锁LOCK
    • python 多进程和多线程使用详解
    • python 实现多进程日志轮转ConcurrentLogHandler
    • python多进程执行方法apply_async使用说明
    • Python 多进程原理及实现
    • python多线程和多进程关系详解
    • Python多进程的使用详情
    上一篇:python jieba库的基本使用
    下一篇:Python接入MySQL实现增删改查的实战记录
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Python多进程与多线程的使用场景详解 Python,多,进程,与,线程,的,