1.内存管理
垃圾回收机制 :
(1) 以引用计数为主, 分代收集为辅
ps: 引用计数的缺陷是循环引用的问题
(2) 如果一个对象的引用数为0, Python虚拟机就会回收这个对象的内存
垃圾回收 :
(1) 满足特定条件, 自动启动垃圾回收
(2) 当Python运行时, 会记录其中分配对象和取消分配对象的次数
(3) 当两者的差值高于某个阈值时, 垃圾回收才会启动
(4) 查看阈值: gc.get_threshold()
分代回收 :
(1) Python将所有对象分为0、1、2 三代
(2) 所有的新建对象都是0代对象
(3) 当某一代对象经历过垃圾回收, 依然存活, 那么它就被归入下一代对象
引用计数 :
(1) 每个对象都存有指向该对象的引用总数
(2) 查看某个对象的引用计数:
sys.getrefcount()
(3) 可以用del关键字删除某个引用
2.Python多线程
1-进程 :
(1) 是一个执行中的程序
(2) 每个进程都拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据
(3) 操作系统管理其上所有进程的执行, 并为这些进程合理地分配时间
(4) 进程也可通过派生(fork 或 spawn)新的进程来执行任务
实现一个进程 :
(1) 使用multiprocessing实现多进程代码
(2) 用multiprocessing.Process创建进程
(3) start() 启动进程、join() 挂起进程
(4) os.getpid() 获得进程ID
进程之间的通信 :
通过Queue、Pipes等实现进程之间的通信
例:
import time
import random
from multiprocessing import Process, Queue, current_process
class WriteProcess(Process):
""" 要写的内容 """
def __init__(self, q, *args, **kwargs):
self.q = q
super().__init__(*args, **kwargs)
def run(self):
""" 实现进程的业务逻辑 """
# 要写的内容
ls = [
"第1行内容",
"第2行内容",
"第3行内容"
]
for line in ls:
print('写入内容: {0}-{1}'.format(line, current_process().name))
self.q.put(line)
# 每写入一次,休息1-5秒
time.sleep(random.randint(1, 5))
class ReadProcess(Process):
""" 读取内容进程 """
def __init__(self, q, *args, **kwargs):
self.q =