Вы отбрасываете только "отправляющие" стороны ваших каналов, и я ожидаю, что большая часть буферизации будет происходить на стороне получателя, поскольку отправка никогда не завершается, и вы можете вызвать recv () после закрытия канала.
Запустив исходный сценарий, я получаю следующее:
Step 1. 640 MB allocated. 652 MB resident
Channel closed for "receiver".
Step 2. Excpected to see same amount of memory like in Step 1, but was: 886 MB allocated. 943 MB resident
Channel closed for "buffered_receiver".
Step 3. Excpected to see around 0 MB allocated, but was: 480 MB allocated. 943 MB resident
, изменяющий сценарий для отбрасывания получателей (receiver
одновременно с buffered_sender
и buffered_receiver
в конце читай ветку, но перед наступлением эпохи) я получаю:
Step 1. 640 MB allocated. 652 MB resident
Channel closed for "receiver".
Step 2. Excpected to see same amount of memory like in Step 1, but was: 406 MB allocated. 943 MB resident
Channel closed for "buffered_receiver".
Step 3. Excpected to see around 0 MB allocated, but was: 0 MB allocated. 943 MB resident
Между прочим перекрестные каналы (которые обычно считаются превосходящими stdlib в каждой точке), похоже, ведут себя так, как ты ожидал, преобразовав скрипт в них (что также позволяет упростить его, так как каналы перекладин могут быть повторены), я получаю:
Step 1. 490 MB allocated. 508 MB resident
Channel closed for "receiver".
Step 2. Excpected to see same amount of memory like in Step 1, but was: 406 MB allocated. 790 MB resident
Channel closed for "buffered_receiver".
Step 3. Excpected to see around 0 MB allocated, but was: 0 MB allocated. 790 MB resident