Есть ли способ отозвать функцию без создания новой программы?
Я пытаюсь реализовать Reliable-UDP в Голанге.
Одной из основных функций, которые мне нужно реализовать, является повторная передача пакетов.
Наивный метод заключается в следующем:
- отправить пакет;
- создайте таймер (также создаст новую программу), чтобы проверить, получено ли ACK до срабатывания таймера.
Это просто, но создание большого количества программ не является бесплатным. И я НЕ думаю, что реализация повторной передачи пакетов в TCP использует этот метод.
Итак, есть ли способ вызвать функцию без создания новой программы?
Я проверил сообщение от golang-nuts ( https://groups.google.com/forum/) и до сих пор не могу найти решение.
2 ответа
Вы можете создать один объект таймера с time.NewTicker, который предоставит канал, который периодически отправляет сообщение.
Вы хотите создать очередь с одним приоритетом, которая содержит все запланированные таймауты. Одна программа должна проверять заголовок очереди с приоритетами, спать до следующего тайм-аута и либо выполнять связанный код, либо отбрасывать его.
Конечно, вам нужно будет решить проблемы с синхронизацией. В Java можно было бы защитить очередь с помощью блокировки. Более гибкий подход заключается в назначении процедуры обработки тайм-аута, отвечающей за определение тайм-аутов, которые она получает по выделенному каналу.
В пакете есть приоритетная реализация очередиcontainer/heap
, но я не проверил, насколько это хорошо.