Обмен информацией по общему объему
Один из лозунгов Go - Не обмениваться данными, используя память; вместо этого, обмениваться памятью, обмениваясь.
Мне интересно, разрешает ли Go два разных скомпилированных двоичных файла, работающих на одном компьютере, для связи друг с другом (то есть клиент-сервер) и насколько быстро это будет по сравнению с boost:: interprocess в С++? Все примеры, которые я видел до сих пор, только иллюстрируют общение между однопроцессорными подпрограммами.
Простой пример Go (с отдельным кодом клиента и кода) будет очень оценен!
Ответы
Ответ 1
Одна из первых вещей, о которых я думал, когда я читал это, был Stackless Python. Каналы в Go напоминают мне много Stackless Python, но это вероятно потому, что (а) я использовал его и (б) язык/мысли, из которых они действительно пришли, я никогда не касался.
Я никогда не пытался использовать каналы в качестве IPC, но, вероятно, потому, что альтернатива, вероятно, намного безопаснее. Вот несколько psuedocode:
program1
chan = channel()
ipc = IPCManager(chan, None)
send_to_other_app(ipc.underlying_method)
chan.send("Ahoy!")
program2
chan = channel()
recv_from_other_app(underlying_method)
ipc = IPCManager(chan, underlying_method)
ahoy = chan.recv()
Если вы используете традиционный метод IPC, у вас могут быть каналы с каждой стороны, которые обертывают их связь поверх него. Это приводит к некоторым проблемам в реализации, о которых я даже не могу думать о том, как бороться, и, вероятно, о нескольких неожиданных условиях гонки.
Однако я согласен; способность общаться через процессы с использованием той же гибкости каналов Go будет феноменальной (но я боюсь, что она нестабильна).
Приобретение простого сокета с каналами с каждой стороны дает вам почти все преимущества.
Ответ 2
Роб сказал, что они много думают о том, как заставить каналы работать как прозрачные RPC (сетевые), в данный момент это не работает, но, очевидно, это то, что они хотят потратить время, чтобы получить его вправо
.
Тем временем вы можете использовать пакет gob, который, хотя и не является идеальным и бесшовным решением, работает уже достаточно хорошо.
Ответ 3
Я посмотрел на аналогичную вещь для упаковки библиотеки MPI. Мое настоящее мышление заключается в том, чтобы использовать что-то вроде
func SendHandler(comm Comm){
// Look for sends to a process
for {
i := <-comm.To;
comm.Send(i,dest);
}
}
func ReceiveHandler(comm Comm){
// Look for recieves from a process
// Ping the handler to read out
for {
_ = <-comm.From;
i := comm.Recv(source);
comm.From <- i;
}
}
где comm.Send и comm.Recv завершают библиотеку c c. Я не уверен, как вы создаете канал для двух разных программ, хотя у меня нет опыта в таких вещах.