2017-01-31 2 views
0

파이썬 2.7 다중 처리 패키지를 사용하여 무한 데이터 스트림에서 작동합니다. 하위 프로세스는 TCP/IP 또는 UDP 패킷을 통해 지속적으로 데이터를 수신하고 즉시 멀티 프로세싱에 데이터를 배치합니다 .Queue. 그러나 특정 간격, 예를 들어, 500ms마다이 데이터의 사용자 지정 슬라이스에서만 작동하려고합니다. 지난 200 개의 데이터 패킷을 가정 해 봅시다.다중 처리 및 큐를 사용하여 무한 데이터 스트림 처리

대기열에 put() 및 get()을 할 수 있다는 것을 알고 있지만 a) 대기열을 백업하고 b) 스레드 안전을 유지하지 않고 해당 데이터 조각을 어떻게 만들 수 있습니까?

대기열이 가득 차는 것을 방지하기 위해 다른 하위 프로세스와 함께 큐에서 끊임없이 get()해야한다고 생각합니다. 그런 다음 사용자 지정 슬라이스를 작성하기 위해 데이터를 다른 데이터 구조 (예 : 목록)에 저장해야합니다. 그러나 데이터 구조는 스레드로부터 안전하지 않으므로 좋은 해결책처럼 들리지는 않습니다.

내가 쉽게하려고하는 프로그래밍 패러다임이 있습니까? multiprocessing.Manager 클래스를 살펴 보았지만 제대로 작동하는지 확신 할 수 없었습니다.

+1

안녕하십니까. 게시하기 전에 질문을하는 포럼을 읽어보십시오. 시도한 것을 보여주고 작동하지 않는 코드를 제공하십시오. 의견을 바탕으로 한 광범위한 질문을 피하십시오. – flyingmeatball

답변

0

다음과 같이이 작업을 수행 할 수 있습니다

  • threading.Lock 클래스의 인스턴스를 사용합니다. 메서드 acquire을 호출하여 특정 스레드에서 큐에 단독 액세스를 요청하고 release을 호출하여 다른 스레드 액세스를 허용합니다.

  • 입력 내용을 계속 수집하려면 전체 대기열을 복사하는 것이 비용이 많이 듭니다. 아마도 가장 빠른 방법은 다른 큐로 스왑하고 이전 스레드를 사용하여 다른 스레드에서 응용 프로그램으로 데이터를 읽는 것보다 먼저 하나의 큐에서 데이터를 수집하는 것입니다. Lock 인스턴스로 스와핑을 보호하면 작성자가 잠금을 획득 할 때마다 현재 '수신기'대기열에서 데이터를받을 준비가되었음을 확인할 수 있습니다.

  • 최근 데이터 만 중요한 경우 대기열 대신 순환 버퍼를 두 개 사용하여 이전 데이터를 덮어 쓸 수 있습니다.