Есть ли утечка памяти в шестнадцатеричной функции MicroPython
Я написал небольшую программу MicroPython для Raspberry PI Pico.
Эта программа создает поток, который увеличивает счетчик и печатает значение в шестнадцатеричном формате.
import _thread
def myThread():
count = 0
while True:
count = count + 1
print(hex(count))
_thread.start_new_thread(myThread, ())
Эта программа всегда терпит неудачу
0x16ea
.
Если я не использую шестнадцатеричную функцию, код работает нормально.
Немного покопаемся, используя
micropython.mem_info()
и похоже, что шестнадцатеричная функция имеет утечку памяти. Или я что-то не так делаю?
3 ответа
Я видел тот же результат при запуске вашей программы на PICO с MicroPython v1.17-59-g782d5b2e5-dirty, который я скомпилировал. Программа запускается, печатает пару мусорных символов и останавливается около того же значения. Я перекомпилировал MicroPython с #define MICROPY_PY_BUILTINS_STR_OP_MODULO (0), установленным в mpconfigport.h, чтобы отключить встроенный шестнадцатеричный код.
Запуск программы теперь приводит к:
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 - это строка печати (шестнадцатеричная (счет)).
Я поднял https://github.com/micropython/micropython/issues/7981, чтобы исследовать это, с меньшим воспроизведением, которое не использует
hex
.
Небольшая поправка к ответу Русса выше, автоматический сбор должен происходить в потоках (и это действительно происходит в этом примере) - в порту rp2040 есть специальный код для обработки сбора независимо от того, какой поток его инициировал.
Компьютер на базе Windows 10 AMD не может воспроизвести ошибку.
Если я запустил программу по умолчанию из вопроса, она просто продолжала работать бесконечно (пытался печатать только каждые 1000000-го отсчета, и это все еще выполнялось быстро).
Чтобы проверить, есть ли утечка памяти, я заменил
print()
часть с
x = hex(count)
, и пусть работает.
Использование памяти было стабильным, не менялось ни вверх, ни вниз, так что нет,
hex()
не имеет утечки.
Так что ваша проблема, вероятно, связана с проблемой совместимости.