Общая память и связь по каналу Go - PullRequest
21 голосов
/ 13 ноября 2009

Один из лозунгов Go - Не общайтесь, разделяя память; вместо этого делитесь памятью, общаясь .

Мне интересно, позволяет ли Go двум разным двоичным файлам, скомпилированным Go, работающим на одной и той же машине, обмениваться данными друг с другом (то есть клиент-сервер), и как быстро это будет по сравнению с boost :: interprocess в C ++? Все примеры, которые я видел до сих пор, только иллюстрируют связь между одними и теми же программами.

Очень хотелось бы получить простой пример Go (с отдельным кодом клиента и сервера)!

Ответы [ 3 ]

7 голосов
/ 13 ноября 2009

Одной из первых вещей, о которых я подумал, когда прочитал это, был Stackless Python. Каналы в Go напоминают мне лот из Stackless Python, но это скорее всего потому, что (а) я использовал его и (б) язык / мысли, что они на самом деле пришли от никогда не трогал.

Я никогда не пытался использовать каналы в качестве IPC, но это, вероятно, потому что альтернатива, вероятно, намного безопаснее. Вот некоторый псевдокод:

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 будет феноменальной (но я боюсь, что она нестабильна).

Однако простое подключение розетки с каналами на каждой стороне дает вам практически все преимущества.

3 голосов
/ 14 ноября 2009

Роб сказал, что они много думают о том, как заставить каналы работать как (сетевой) прозрачный RPC, в данный момент это не работает, но, очевидно, это то, что они хотят потратить время, чтобы его получить право .

Тем временем вы можете использовать пакет gob , который, хотя и не является идеальным и беспроблемным решением, уже работает достаточно хорошо.

2 голосов
/ 14 ноября 2009

Я смотрел на аналогичную вещь для упаковки библиотеки 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 связями. Я не уверен, как вы настраиваете канал для двух разных программ, но у меня нет такого опыта.

...