Подтвердить что ты не робот

Обмен информацией по общему объему

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

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

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

4b9b3361

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