2010-06-30 5 views
0

파이썬에서 소켓을 사용하여 한 응용 프로그램에서 다른 응용 프로그램으로 매우 큰 문자열을 localhost로 보냈습니다. 작은 끈은 즉시 움직이지만 큰 끈은 오래 걸리는 것처럼 보입니다. (나는 크다고 말하지만, 아마도 대부분은 MB 나 두 가지를 말하고 있습니다). 한 앱에서 무언가를 한 후에 다른 앱에 표시되기까지 몇 초 기다려야 만합니다.파이썬 소켓을 사용한 로컬 호스트 병목 현상

여기에 어떤 병목 현상이 있습니까? 내가 이해하고있는 것처럼, 127.0.0.1의 소켓을 사용하면, 실제로하는 일은 메모리의 한 지점에서 다른 지점으로 데이터를 이동시키는 것입니다. 한 번에 수백 MB의 데이터를 전송하면 워크 스테이션에서 지각 적으로 즉시 이동해야합니다.

+0

얼마나 느린가요? 결과를 재현하고 병목 현상을 식별 할 수 있도록 벤치 마크 및 테스트 코드를 제공하십시오. – nosklo

+0

당신이하려는 일에 대한 간단한 예를 제시 할 수 있어야합니다. 복사 - 붙여 넣기 가능성을 가지면 적어도 그것을 시험해보고 어떤 일이 일어나는지 볼 수 있습니다. –

+0

방대한 버퍼가있는'send (2)'를 하나하고 있습니까? 싱글/멀티 코어 박스? –

답변

3

네트워크 인터페이스 카드 자체를 통과하지 않고 전체 네트워크 스택을 통해 데이터를 이동하고 있습니다.

localhost를 사용하여 네트워크 스택에서 가져온 바로 가기가있을 수 있지만 사용중인 시스템에서 스택이 구현되는 방식에 따라 달라질 수 있습니다. 관계없이 공유 메모리 나 파이프는 훨씬 빠릅니다. 여기

는 높은 수준의 개요입니다 : http://docs.python.org/howto/sockets.html

PS :이 사건에 대한 작동하는지 확인하지만, 멀티 모듈은 효율적인 방법으로 여러 프로세스간에 데이터를 공유하는 몇 가지 방법을 가지고하지 않습니다.

PPS : TCP 소켓 대신 UDP 소켓을 사용해 볼 수 있습니다. 이렇게하면 잠재적으로 더 나은 처리량을 제공 할 수 있으며 IPC 방법을 대폭 변경하지 못할 수 있습니다.

+0

그러면 소켓을 통해 문자열을 보내기 전에 문자열을 압축하고 다른 쪽에서 문자열을 압축하는 것이 합리적일까요? – directedition

+0

소켓은 앱을 배포 할 때 매우 유연합니다. 두 개의 프로세스를 공유 메모리를 통해 두 개의 상자로 분산시키는 것은 중요한 코딩 작업입니다. 소켓의 경우 매개 변수 변경입니다. 항상 트레이드 오프입니다. –

+0

@directedition : 아니오. 압축은 이득보다 훨씬 느립니다. – nosklo

관련 문제