Python学习笔记#12 内存管理机制与多线程

这篇博客探讨了Python的内存管理机制,包括垃圾回收的引用计数和分代收集,以及如何查看引用计数。同时,文章详细介绍了Python的多线程,包括进程的概念、创建与通信,线程的并发执行以及协程的协同多任务特性,最后展示了如何在Python中实现协程和数据通信。
摘要由CSDN通过智能技术生成

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 =
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值