Труднее взять синхронный API (например, queue.Read, как вы описали выше) и сделать его асинхронным, чем сделать наоборот.
Идея состоит в том, чтобы создать новую процедуру (используя,например, пойти func () {...}) и заставить эту программу выполнить чтение и записать вывод в канал.
Тогда первая программа заблокирует этот канал и тот, который уже блокирует.
Это потенциально может на некоторое время оставить потерянные ресурсы, если чтение занимает много времени, но если у вас синхронный API, это лучшее, что вы можете сделать.