Запуск подпроцесса через зависание многопроцессорности Python - PullRequest
4 голосов
/ 01 июня 2011

Я использую pyAudio для прослушивания аудиоустройства и выполняю некоторые "вещи" в фоновом режиме, пока основная программа продолжает работать.

Я начал со второго сценария, но хотел бы объединитьв единый скрипт для поддержки.Когда я переместил функции и использую Process для запуска прослушивателя, он просто зависает и никогда не запускается.

Вот упрощенные фрагменты кода:

        def listener(self, q):
            CHANNELS = 2
            RATE = 44100
            INPUT_BLOCK_TIME = 0.05
            FORMAT = pyaudio.paInt16
            RATE = 44100
            INPUT_FRAMES_PER_BLOCK = int(RATE*INPUT_BLOCK_TIME)

            p = pyaudio.PyAudio()
            stream = p.open(format = FORMAT,
                        channels = CHANNELS,
                        rate = RATE,
                        input = True,
                        frames_per_buffer = INPUT_FRAMES_PER_BLOCK)
            q.put(os.getpid())
            import time
            time.sleep(300)


        def startListener(self):
            q = Queue()
            p = Process(target=self.listener, args=[q])
            p.daemon=True
            p.start()
            print q.get()

Теперь, если я удалю следующий потокзатем я получаю идентификатор процесса обратно, как и ожидалось:

           stream = p.open(format = FORMAT,
                        channels = CHANNELS,
                        rate = RATE,
                        input = True,
                        frames_per_buffer = INPUT_FRAMES_PER_BLOCK)

Что-то не так с многопроцессорностью и многопоточностью?Это плохая идея?Стоит ли хранить код слушателя в отдельном скрипте?

Заранее спасибо!

1 Ответ

1 голос
/ 24 августа 2011

Метод __init__ для pyaudio.open():

__init__(self, PA_manager, rate, channels, format, input=False, output=False, input_device_index=None, output_device_index=None, frames_per_buffer=1024, start=True, input_host_api_specific_stream_info=None, output_host_api_specific_stream_info=None) 

Согласно документации на их веб-сайте.Похоже, вы не устанавливаете PA_manager, который выглядит как обязательный параметр.

...