2011-06-01 32 views
4

我正在使用pyAudio来听音频设备,并在主程序继续运行时在后台执行一些“内容”。通过python多处理启动子进程挂起

我从第二个脚本开始,但希望整合到单个脚本中以提供可支持性。当我将函数移入并使用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() 

现在,如果我删除以下流的设置,然后我得到的进程ID早在预期:

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

有一些关于多和线程我失踪了?这是一个坏主意吗?我应该坚持将侦听器代码保存在单独的脚本中吗?

在此先感谢!

+0

好的,发布后,我意识到这可能不是一个严格的python问题。虽然代码是python,但它正在web2py框架下运行。我在web2py之外测试过,效果很好。我将打开问题并将问题发送到web2py邮件列表。如果我得到修复,我也会在这里发布。 – Nite 2011-06-01 15:11:30

回答

1

__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,它看起来像一个必需的参数。