Очередь производитель-потребитель в python - PullRequest
0 голосов
/ 13 июня 2019

Я использую потребительскую модель производителя для потоковой передачи аудио через сокеты в PyAudio. У меня есть один процесс, получающий данные из сокетов, процесс, затем помещающий их в очередь, в то время как другой процесс получает данные из очереди и записывает их в поток. Пока это работает, я получаю недостаточное количество + отсечение во время отдельных частей потока. Мой код по сути как таковой

Process1

CHUNK = 1024
q = queue


data = s.recv(CHUNK)

#processes data

if q.qsize() < CHUNK * 2: #arbitrary value
    q.put(data)

while q.qsize() > CHUNK:
    time.sleep(5) 
#I use this to allow the queue to be emptied
#by the stream and manage my memory somewhat.

Process2

p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=CHANNELS, rate=RATE, frames_per_buffer=CHUNK, output=True)

while True:
    if q.empty() is False:
        stream.write(q.get(), exception_on_underflow=True)

Я сделал некоторую регистрацию, чтобы регистрировать данные до и после того, как показывается исключение недостаточного потока, и я замечаю, что недостаточное заполнение будет происходить только когда q> = CHUNK (например, 1025,1026) или при первоначальном заполнении потока до 1024, и stream.get_write_availble всегда был> 15000 из общего числа 16384. Я знаю, что потоку не хватает данных, но я не совсем понимаю, почему и как это возможно, когда очередь никогда не пуста (например, всегда есть данные для чтения в поток). Любая помощь приветствуется.

...