스레드 사이의 간단한 바이트 스트림에 파이썬 큐가 필요합니까?

StackOverflow https://stackoverflow.com/questions/1640112

  •  08-07-2019
  •  | 
  •  

문제

나는 Bluetooth rfcomm (Serial-Port-like) 소켓에서 바이트를 잡고 그것들을 Queue.Queue (FIFO)는 스레드간에 데이터를 교환하는 일반적인 방법처럼 보입니다. 잘 작동합니다.

그래도 이것은 과잉입니까? 바이트 레이를 사용한 다음 내 독자 스레드가 있으면 .append(somebyte) 그리고 처리 기능 .pop(0)? 대기열의 보호가 더 복잡한 "다중 프로듀서, 다중 소비기 큐"및 포인트 간 바이트 스트림을위한 폐기물을위한 것인지 확실하지 않습니다. 대기열을 플러시하거나 여러 바이트를 잡는 것과 같은 일을하는 것은 큐와 더 간단한 데이터 유형으로 더 어색해 보입니다.

답은 IF와 관련이있을 것 같아요 .pop() 원자력이지만 그때도 중요할까요? ...

도움이 되었습니까?

해결책

와 함께 Queue, 당신은 보장 Python의 모든 구현 및 버전에서 ScressAfe가됩니다. "Atomic"(주어진 구현 및 버전에서)이라는 다른 물체 의이 방법 또는 그 방법에 의존하는 것은 일반적 으로이 "원자력"의 자비를 강력하게 보장하지 않습니다 (특정 포인트 릴리스에 대한 구현 아티팩트 만 'RE 사용)이므로 미묘하고 매우 어려운 경쟁 조건이 다른 Python 구현에 대한 업그레이드 또는 포트와 함께 도입됩니다.

당신의 프로파일 링이 당신에게 그것을 말하면 Queue강력하고 일반적인 보증은 특정 생산자 소비자 사용 사례에 대한 병목 현상이되며, 스레드 스페이프 FIFO 대기열/스트림을 더 간단하게 보장합니다. 예를 들어, 그 사실을 알게된다면 (인종 조건의 순) append 그리고 pop 사용하기에 완벽 할 것입니다. 잠금 획득/릴리스로 각각을 보호하는 클래스를 만드십시오 (사용하십시오. with 성명) -- Queue 여러 생산자와 소비자를 지원하기 위해 소형 오버 헤드를 추가하면 몇 나노초를 벗을 수 있습니다!-)

다른 팁

예, POP ()는 원자력이지만 성능이 매우 중요하지 않은 경우 대기열을 고수합니다.

입력 속도가 충분히 빠르면 큐에 밀어 넣기 전에 항상 스트링에 바이트를 버퍼 할 수 있습니다. 이는 수신 종료에 약간의 추가 대기 시간을 희생하여 수행 된 잠금의 양을 줄임으로써 처리량을 증가시킬 것입니다.

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