Python 进阶
Python 协程实现原理
dict 和 set 实现原理
Python 线程安全
Python 抽象语法树(AST)
Python 日志输出
Python 扩展入门(一)
Python 程序执行原理
Python 垃圾回收
Python 动态创建类
检查工具
PyFrameObject
yield 生成器工作原理
dict 设计与实现
Python 性能分析原理
PyCodeObject
Python 弱引用
Python 性能分析原理(二)
Python 源码分析(一)
Python Annotated
Python 依赖注入
python freelist
python代码编译成pyc
Python mmap 内存映射文件
Python值得学习的内容
async Future 对象
asyncio loop的实现
asyncio.sleep 的实现
asyncio 原理
Python 代码加密
Python Token类型
Python 扩展入门(二)
Python 性能优化
本文档使用 MrDoc 发布
-
+
首页
Python 弱引用
`weakref.ref`是 Python 标准库`weakref`模块中的一个函数,用于创建一个弱引用对象。弱引用允许你引用一个对象而不阻止该对象被垃圾回收。当对象的引用计数降为零时,即使还有弱引用指向它,该对象也会被垃圾回收。 ### 主要特点 - **弱引用**:弱引用不会增加对象的引用计数,因此不会阻止对象被垃圾回收。 - **回调函数**:可以为弱引用指定一个回调函数,当对象被垃圾回收时,这个回调函数会被调用。 ### 用法 ```python import weakref # 创建一个对象 class MyClass: pass obj = MyClass() # 创建一个弱引用,并指定回调函数 def weakref_cb(reference): print(f"{reference} 被垃圾回收") weak_ref = weakref.ref(obj, weakref_cb) # 访问弱引用对象 print(weak_ref()) # 输出: <__main__.MyClass object at 0x...> # 删除强引用 del obj # 尝试访问弱引用对象 print(weak_ref()) # 输出: None ``` ### 解释 1. **创建对象**: ```python obj = MyClass() ``` 创建一个 `MyClass` 的实例对象 `obj`。 2. **创建弱引用**: ```python weak_ref = weakref.ref(obj, weakref_cb) ``` 使用`weakref.ref`创建一个指向 `obj` 的弱引用,并指定回调函数`weakref_cb`。 3. **访问弱引用对象**: ```python print(weak_ref()) # 输出: <__main__.MyClass object at 0x...> ``` 通过弱引用访问原始对象。 4. **删除强引用**: ```python del obj ``` 删除 `obj` 的强引用,此时对象的引用计数降为零,对象会被垃圾回收。 5. **尝试访问弱引用对象**: ```python print(weak_ref()) # 输出: None ``` 对象已被垃圾回收,弱引用返回`None`。 在thread.py中的应用在你提供的`thread.py`文件片段中,`weakref.ref`被用来创建一个指向执行器(executor)的弱引用,并在执行器被垃圾回收时调用回调函数`weakref_cb`。 ```python def _adjust_thread_count(self): # ...省略部分代码... # 当执行器丢失时,弱引用回调将唤醒工作线程。 def weakref_cb(_, q=self._work_queue): q.put(None) num_threads = len(self._threads) if num_threads < self._max_workers: thread_name = '%s_%d' % (self._thread_name_prefix or self, num_threads) t = threading.Thread(name=thread_name, target=_worker, args=(weakref.ref(self, weakref_cb), self._work_queue, self._initializer, self._initargs)) t.daemon = True t.start() self._threads.add(t) ``` ### 解释 1. **定义回调函数**: ```python def weakref_cb(_, q=self._work_queue): q.put(None) ``` 定义一个回调函数`weakref_cb`,当执行器被垃圾回收时,这个函数会被调用,并向工作队列 `q`中放入`None`,以唤醒工作线程,工作线程发现执行器已经被回收了,自己就会退出。 2. **创建弱引用**: ```python weakref.ref(self, weakref_cb) ``` 使用`weakref.ref`创建一个指向当前执行器实例`self`的弱引用,并指定回调函数`weakref_cb`。 3. **启动新线程**: ```python t = threading.Thread(name=thread_name, target=_worker, args=(weakref.ref(self, weakref_cb), self._work_queue, self._initializer, self._initargs)) t.daemon = True t.start() self._threads.add(t) ``` 创建并启动一个新线程,在线程的目标函数`_worker`中传递弱引用和其他参数。 ### 总结 `weakref.ref`用于创建一个弱引用对象,允许你引用一个对象而不阻止该对象被垃圾回收。在 `thread.py`中,弱引用用于在执行器被垃圾回收时唤醒工作线程,以便它们可以检查执行器是否已被回收,并相应地退出。
gaojian
2024年10月12日 18:59
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码