• python多进程的坑及监测运行内存


    • 插播:python生成字典的方法
    1. 直接创建/键值对创建:dic={'a':1,'b':2,'c':3} dic=dict(a=1,b=2,c=3)
    2. 二元组列表创建:list=[('a',1),('b',2),('c',3)] dic=dict(list)
    3. 用dict和zip:dic=dict(zip('abc',[1,2,3]))
    4. 字典推导式:dic={i:2*i for i in range(3)}
    5. 初始化为同一个值:list=[a,b,c] dic=dict.fromkeys(list,1)
    • python多进程Multiprocessing 模块
    1. 最近在写了个python多进程代码,里面有一些坑,需要尤其注意,多进程间通信需要用multiprocessing.Manager().Queue()队列,在代码中,开始能跑通,后来出现很多报错,折腾了很久,发现与队列有关,总结如下:
      timeout用起来是有讲究的,如果队列put完成再从队列中get,就可以不加timeout,用get_nowait()也可以,如果队列边进边出但是计算得比较快,需要加延时,否则报错Broken pipe。如果边进边出还计算很慢,就得在get队列里的元素时加一些措施。
      如果用了join,程序运行会很慢,它应该是主进程任务结束之后,进入阻塞状态,一直等待其他的子进程执行结束之后,主线程再终止。
      另外,在判断队列是否为空时,尽量用try-except语句,直接用while语句判断会报错Connection reset by peer或在进程指定多的时候报错raise EOFError。
    2. 队列的get问题,get_nowait()是无阻塞的向队列中get任务,当队列为空时,不等待,而是直接抛出empty异常。get()默认为阻塞方式,队列为空时不抛出异常,直至等待超时。
    3. 其他的后续再进行研究测试。测试无误后会放一部分代码上来。欢迎讨论。
    • python内存占用监测memory_profiler模块
    1. 安装pip install memory_profile,按照网上的建议,把psutil也安装一下pip install psutil。
    2. 安装后可以用mprof run xxx.py运行程序,伴随程序生成.dat文件,mprof run即可生成图形显示程序运行占用内存情况。它的原理是在代码运行过程中每0.1S统计一次内存,并生成统计图。用的单位是MiB,严格来讲1MB = 1000 KB,1MiB = 1024 KiB。
    3. mprof clean清除所有.dat文件。
    4. 需要在函数前加装饰器时,from memory_profiler import profile。在函数前加@profile。
  • 相关阅读:
    sparse用法matlab官方说明
    C++双向循环链表
    循环链表以及迭代器的使用c++
    顺序队列c++
    顺序栈c++
    尾插法链表
    邻接表建立图
    深度优先搜索树与广度优先搜索树
    tensorflow-笔记02
    深度学习-框架介绍
  • 原文地址:https://www.cnblogs.com/pythonClub/p/16473776.html
Copyright © 2020-2023  润新知