MicroPython hex 函数中是不是存在内存泄漏
Posted
技术标签:
【中文标题】MicroPython hex 函数中是不是存在内存泄漏【英文标题】:Is there a memory leak in MicroPython hex functionMicroPython hex 函数中是否存在内存泄漏 【发布时间】:2021-12-16 03:45:44 【问题描述】:我为 raspberry PI Pico 编写了一个小型 MicroPython 程序。
这个程序创建一个线程,它增加一个计数器并以十六进制打印值。
import _thread
def myThread():
count = 0
while True:
count = count + 1
print(hex(count))
_thread.start_new_thread(myThread, ())
这个程序总是在0x16ea
失败。
如果我不使用十六进制函数,代码可以正常工作。
使用micropython.mem_info()
进行一些挖掘,看起来十六进制函数存在内存泄漏。还是我做错了什么?
【问题讨论】:
通过 micropython 的 pico 线程充其量是不可靠的。使用“异步”可能会有更好的结果。 【参考方案1】:当我使用我编译的 MicroPython v1.17-59-g782d5b2e5-dirty 在 PICO 上运行程序时,我看到了相同的结果。程序运行,打印几个垃圾字符并在相同的值附近停止。我重新编译了 MicroPython,并在 mpconfigport.h 中设置了 #define MICROPY_PY_BUILTINS_STR_OP_MODULO (0) 以禁用内置的十六进制。
现在运行程序会导致:
Unhandled exception in thread started by <function myThread at 0x20009810>
Traceback (most recent call last):
File "test.py", line 8, in myThread
MemoryError: memory allocation failed, allocating 0 bytes
第 8 行是 print(hex(count)) 行。 hex 方法为其返回的新字符串对象分配一些内存,MicroPython 不会在线程中进行自动垃圾回收。
如果您在内存不足之前将程序修改为 gc.collect(),则程序运行时不会停止
import gc
import _thread
def myThread():
count = 0
while True:
count = count + 1
print(hex(count))
if (count % 1000 == 0):
gc.collect()
_thread.start_new_thread(myThread, ())
【讨论】:
【参考方案2】:我已提出 https://github.com/micropython/micropython/issues/7981 来调查此问题,并使用不使用 hex
的较小复制品。
对上面 Russ 的回答的小修正,自动收集应该发生在线程中(在这个例子中它实际上发生了)——rp2040 端口中有特定的代码来处理收集,无论哪个线程触发它。
【讨论】:
以上是关于MicroPython hex 函数中是不是存在内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
导入 micropython 中存在的模块时出现 ImportError
为啥 Hex() 函数返回一个字符串而不是一个 int hex?
MicroPython内核开发笔记书内软件用例 :浮点数相关实验