用于播放不同声音的音频的 python 线程,似乎没有正确锁定,并且函数的开头在线程调用后返回

标签 python multithreading locks

我正在编写根据键盘输入从计算机播放声音的代码。声音存储为 wav 文件并使用 PyAudio 播放。然而,两次连续键盘敲击所播放的声音之间的延迟太慢,因此我试图添加线程以加快 I/O 时间。然而,音频现在变得沙哑,我认为线程上的锁没有起作用。相关代码如下:

while threading.activeCount() < NUM_THREADS:
   message, delta_time = midi_in.get_message()
   if message:
    if message[2] == 0:
     continue
    elif message and (str(message[1]) == "108" or str(message[1]) == "107"):
     break
    else:
     t = threading.Thread(target=play, args=(message,))
     lock = threading.Lock()

     lock.acquire()
     t.start()
     lock.release()



def play(message):

  WAVE_FILENAME = "final"+str(message[1]) + '.wav'
  CHUNK = 1024
  wf = wave.open(WAVE_FILENAME)
  p = pyaudio.PyAudio()

  stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                 channels = wf.getnchannels(),
             rate = wf.getframerate(),
                 output = True)
  data = wf.readframes(CHUNK)
  while data != '':
   stream.write(data)
   data = wf.readframes(CHUNK)

  stream.stop_stream()
  stream.close()

  p.terminate()

非常感谢您的帮助!

最佳答案

I don't think the locks on the threads are working

原因是下面创建了一个新锁:

lock = threading.Lock()

换句话说,您没有在循环的迭代中使用相同的锁;每次迭代都有自己的锁。因此,不会发生同步。

关于用于播放不同声音的音频的 python 线程,似乎没有正确锁定,并且函数的开头在线程调用后返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14128199/

相关文章:

java - 在单独的线程上进行网络操作和解析

c++ - 数组上的多线程/这里需要锁定机制吗?

concurrency - 如何在 Rust 中使用锁?

Python 3.5 - Pandas - 从另一个方法调用带有 for 循环的方法

python - 使用 lxml lib 读取 xml 从 xmlns 标记中获取奇怪的字符串

python - 更新anaconda和安装新包的问题

python - SQLAlchemy 告诉我 "AttributeError: type object ' User' 没有属性 'columns' "

java - android中调用AsyncTask.cancel(true)时AsyncTask不会立即调用 `onCancelled`

c - C语言中的信号量锁解决方案

mysql - 我应该在 MySQL 中使用自定义 'locks' 表吗?