문제

나는 다음과 같은 가능한 IPC 메커니즘에 대한 제안을 찾고 있습니다.

  • 크로스 플랫폼 (적어도 Win32 및 Linux)
  • 구현이 간단함 C++ 뿐만 아니라 가장 일반적인 스크립팅 언어 (펄, 루비, 파이썬 등).
  • 마지막으로, 사용이 간단하다 프로그래밍 관점에서!

내 옵션은 무엇입니까?나는 Linux에서 프로그래밍하고 있지만 앞으로는 다른 OS에도 이식할 수 있도록 작성하고 싶습니다.나는 소켓, 명명된 파이프 또는 DBus와 같은 것을 사용하는 것에 대해 생각해 보았습니다.

도움이 되었습니까?

해결책

속도 측면에서 가장 좋은 크로스 플랫폼 IPC 메커니즘은 파이프입니다.그러나 이는 동일한 시스템에서 크로스 플랫폼 IPC를 원한다고 가정합니다.원격 컴퓨터의 프로세스와 대화하려면 대신 소켓을 사용하는 것이 좋습니다.운 좋게도 최소한 TCP에 관해 이야기하고 있다면 소켓과 파이프는 거의 동일한 동작으로 작동합니다.이를 설정하고 연결하는 API는 다르지만 둘 다 데이터 스트림처럼 작동합니다.

그러나 어려운 부분은 의사소통 채널이 아니라 그 채널을 통해 전달하는 메시지입니다.당신은 정말로 당신을 위해 검증과 분석을 수행할 무언가를 보고 싶어합니다.Google을 살펴보는 것이 좋습니다. 프로토콜 버퍼.기본적으로 프로세스 간에 전달하려는 개체를 설명하는 사양 파일을 만들고, 사양과 일치하는 개체를 읽고 쓰기 위해 다양한 언어로 코드를 생성하는 컴파일러가 있습니다.메시징 프로토콜과 파서를 직접 고안하는 것보다 훨씬 쉽고 버그 발생 가능성도 적습니다.

다른 팁

C++의 경우 다음을 확인하세요. 부스트 IPC.
스크립팅 언어에 대한 일부 바인딩을 만들거나 찾을 수도 있습니다.

그렇지 않고 스크립팅 언어와 인터페이스할 수 있는 것이 정말 중요하다면 최선의 방법은 단순히 파일, 파이프, 소켓 또는 심지어 HTTP와 같은 더 높은 수준의 추상화를 사용하는 것입니다.

왜 D-Bus가 아닌가?이는 거의 모든 플랫폼에서 실행되고 견고성을 위해 설계된 매우 간단한 메시지 전달 시스템입니다.현재 거의 모든 스크립팅 언어에서 지원됩니다.

http://freedesktop.org/wiki/Software/dbus

시도해 볼 수도 있습니다. 야미 , 매우 간단하면서도 기능적이며 이식 가능하며 몇 가지 언어로 바인딩됩니다.

휴대 가능하고 사용하기 쉬운 다중 언어 및 LGPLed 솔루션을 추천합니다 ZeroMQ:

  • 놀랍도록 빠르고 거의 선형적으로 확장 가능하며 여전히 단순합니다.
  • 단순하고 복잡한 시스템/아키텍처에 적합합니다.
  • 매우 강력한 통신 패턴 사용 가능:REP-REP, PUSH-PULL, PUB-SUB, PAIR-PAIR.
  • 스레드 간에 메시지를 전달하는 경우 전송 프로토콜을 보다 효율적으로 구성할 수 있습니다(inproc://), 프로세스(ipc://) 또는 기계({tcp|pgm|epgm}://), VMware 가상 머신 간에 연결이 실행되는 경우 프로토콜 오버헤드의 일부를 줄이는 스마트 옵션(vmci://).

직렬화를 위해 나는 제안하고 싶습니다 메시지팩 또는 필요에 따라 프로토콜 버퍼(다른 사람도 이미 언급함).

어때? 페이스북의 절약?

Thrift는 확장 가능한 교차 언어 서비스 개발을 위한 소프트웨어 프레임워크입니다.소프트웨어 스택과 코드 생성 엔진을 결합하여 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 및 OCaml 간에 효율적이고 원활하게 작동하는 서비스를 구축합니다.

나는 당신이 소켓을 기반으로 한 것을 원할 것이라고 생각합니다.

IPC가 아닌 RPC를 원한다면 HTTP를 통해 실행되고 모든 언어에서 사용할 수 있는 XML-RPC/SOAP와 같은 것을 제안합니다.

YAMI - 또 다른 메시징 인프라 경량 메시징 및 네트워킹 프레임워크입니다.

조금 다른 것을 시도해보고 싶다면 다음이 있습니다. 얼음 플랫폼 제로C.오픈 소스이며 여러분이 생각할 수 있는 거의 모든 OS에서 지원될 뿐만 아니라 C++, C#, Java, Ruby, Python 및 PHP에 대한 언어 지원도 제공됩니다.마지막으로, 운전하기가 매우 쉽습니다(언어 매핑은 각 언어에 자연스럽게 맞도록 맞춤화되어 있습니다).또한 빠르고 효율적입니다.장치에 대한 축소 버전도 있습니다.

나는 당신에게 다음을 사용하도록 제안할 수 있습니다. 플립시스 C 라이브러리.매우 간단하고 가벼우며 크로스 플랫폼입니다.LGPL로 출시되었습니다.다음을 제공합니다:

  • 명명된 시스템 전체 공유 메모리 영역(System V, POSIX 및 Windows 구현)
  • 액세스 동기화를 위한 명명된 시스템 전체 세마포어(System V, POSIX 및 Windows 구현)
  • 공유 메모리 및 세마포어를 기반으로 명명된 시스템 전체 공유 버퍼 구현.
  • IPv4 및 IPv6 지원(UNIX 및 Windows 구현)이 포함된 소켓(TCP, UDP, SCTP).

꽤 좋은 문서가 포함된 라이브러리를 사용하기 쉽습니다.C로 작성되었으므로 스크립팅 언어에서 쉽게 바인딩을 만들 수 있습니다.

프로세스 간에 대규모 데이터 세트를 전달해야 하는 경우(특히 속도가 중요한 경우) 공유 메모리를 사용하여 데이터 자체를 전달하고 소켓을 사용하여 데이터가 준비되었음을 프로세스에 알리는 것이 좋습니다.다음과 같이 만들 수 있습니다.

  • 프로세스는 데이터를 공유 메모리 세그먼트에 넣고 소켓을 통해 다른 프로세스에 알림을 보냅니다.일반적으로 알림은 매우 작기 때문에 시간 오버헤드가 최소화됩니다.
  • 다른 프로세스는 알림을 수신하고 공유 메모리 세그먼트에서 데이터를 읽습니다.그런 다음 더 많은 데이터를 제공할 수 있도록 데이터를 첫 번째 프로세스로 다시 읽었다는 알림을 보냅니다.

이 접근 방식은 크로스 플랫폼 방식으로 구현될 수 있습니다.

분산 컴퓨팅은 일반적으로 복잡하므로 처음부터 다시 만드는 대신 기존 라이브러리나 프레임워크를 사용하는 것이 좋습니다.이전 포스터에서는 이미 이러한 라이브러리와 프레임워크 몇 가지를 열거했습니다.필요에 따라 매우 낮은 수준(소켓 등)이나 높은 수준 프레임워크(CORBA 등)를 선택할 수 있습니다.일반적인 "이것을 사용하세요"라는 대답은 있을 수 없습니다.분산 프로그래밍에 대해 스스로 교육해야 하며 작업에 적합한 라이브러리나 프레임워크를 선택하는 것이 훨씬 더 쉽다는 것을 알게 될 것입니다.

분산 컴퓨팅을 위해 널리 사용되는 ACE 및 CORBA ORB TAO(ACE를 기반으로 구축됨)라는 C++ 프레임워크가 있습니다.ACE에 관한 아주 좋은 책이 있습니다. http://www.cs.wustl.edu/~schmidt/ACE/ 그래서 한 번 살펴볼 수도 있습니다.잘 지내세요!

내가 아는 모든 OS에서 지원되고 거의 모든 언어로 액세스할 수 있는 파이프를 사용하는 것보다 더 간단한 것은 없습니다.

확인해 보세요 이것 지도 시간.

로컬호스트 FTW에 대한 TCP 소켓.

Python에는 꽤 좋은 IPC 라이브러리가 있습니다.보다 https://docs.python.org/2/library/ipc.html

Xojo에는 크로스 플랫폼 IPC 지원 기능이 내장되어 있습니다. IPCocket 클래스.분명히 다른 언어로 "구현"할 수는 없지만 Xojo 콘솔 앱에서 사용하고 다른 언어에서 호출할 수 있으므로 이 옵션이 매우 간단해질 수 있습니다.

Google protobufs는 코드를 쉽게 유지 관리하고 디버깅하기를 원하는 정말 나쁜 아이디어입니다.사람들이 그것을 남용하고 코드를 오염시키는 데 사용하기가 너무 쉽습니다.proto 파일은 훌륭하지만 기본적으로 구조 헤더 파일과 동일하며 생성되는 코드는 완전히 쓰레기이므로 소프트웨어 프로젝트를 자동화하는 대신 방해하는 은밀한 공격 도구인지 궁금합니다.한동안 사용한 후에는 코드에서 제거하는 것이 거의 불가능합니다.쉽게 디버깅할 수 있는 수정 형식 구조의 헤더 파일을 사용하는 것이 더 좋습니다.

정말로 압축이 필요한 경우 원격으로 파일 구조의 주소/데이터 매핑으로 전환하세요.그러면 패킷은 단지 주소/데이터 쌍의 묶음일 뿐입니다.또한 사람이 읽고 디버깅할 수 있는 코드를 생성하는 자체 Perl 스크립트로 자동화하기 매우 쉬운 구조입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top