zoukankan      html  css  js  c++  java
  • python中的多线程和多进程

    一、简单理解一下线程和进程

      一个进程中可有多个线程,线程之间可共享内存,进程间却是相互独立的。打比方就是,进程是火车,线程是火车厢,车厢内人员可以流动(数据共享)

    二、python中的多线程和多进程

      当遇到大文件读写或处理计算时,需要加速,则用上多线程和多进程,最常见的例子是网页爬虫,每次访问后等待时间很长,所以用了异步访问。

      先说结论,多线程适合IO密集型任务,多进程适合计算密集型任务。

      在python中,遇到IO操作,GIL(全局解释锁)会被释放,执行下一个操作,此时用到线程即可,如果开辟进程的话,需要分配初始化的时间和空间。计算密集型用线程则不行,因为若一个计算任务没有完成时,锁不会释放,所以线程相当于串行了。借用知乎上的比喻,有一个水池,4个泵,1个人,人同时只能操作一个泵,则此时相当于串行,但如果泵的工作冷却时间比为1:3,则利用率可以达到100%,其中冷却时间相当于IO操作的等待时间,此时多线程有效。

      很多时候python多线程加速有限,除非是IO密集型场景,如爬虫访问网页。

    三、python代码

      多进程:from multiprocessing import Pool

        pool = Pool(5)

      多线程:from multiprocessing.pool import ThreadPool

        pool = TreadPool(5)

    四、代码模板

      注意pool.apply_async的用法(异步执行)

      可视化操作用到pbar

      pool.close()  #关闭进程池/线程池

      pool.join()     #阻塞主进程,等待所有子进程结束后再运行

      其他话:有时候在jupyterlab中大数据操作时,感觉会有进程间锁死的奇怪问题,或者加速效果不明显的问题,仍需要研究

    from multiprocessing import Pool
    from multiprocessing.pool import ThreadPool
    
    import math
    import datetime
    
    from tqdm import tqdm
    from multiprocessing import Pool, cpu_count
    import os, time, random
    
    def func(num):
        name = num
        #for i in tqdm(range(5), ncols=80, desc='执行任务' + str(name) + ' pid:' + str(os.getpid())):
        for i in range(5):
            # time.sleep(random.random() * 3)
            time.sleep(1)
        print("finished")
        pbar.update()
        
    
    print("cpu_count():",cpu_count())
    pool = Pool(10)
    
    start = time.time()
    with tqdm(total=50) as pbar:
        for i  in (range(50)):
            pool.apply_async(func, args=(i,))   
        pool.close()
        pool.join()
    
        
    end = time.time()
    print("
    应用多进程耗时: %0.2f seconds" % (end - start))
    
    print("over")
  • 相关阅读:
    libxml2 使用教程【转】
    c++实现Xml和json互转【转】
    C++中JSON的使用详解【转】
    Libxml2函数及使用方法概述【转】
    首个threejs项目-前端填坑指南【转】
    如何使用chrome自带的Javascript调试工具 【转】
    require.js 最佳实践【转】
    Cesium中导入三维模型方法(dae到glft/bgltf) 【转】
    华为ap3010DN-V2刷出胖AP并配置接入POE交换机实现上网
    k8s cronjob设置作业失败后退出不重复执行
  • 原文地址:https://www.cnblogs.com/qiezi-online/p/13743505.html
Copyright © 2011-2022 走看看