TL; DR
我想使用daemon
创建类似于threading
的东西。我使用Windows机器。因此,python-daemon
在我的系统上不起作用。
问题
我正在开发一个应用程序,该应用程序在检测到事件时使用threading
生成提示音。在该应用程序中,我正在流处理一些数据,处理并检测某些事件。当检测到事件时,会发出提示音。我正在用thread
创建一个daemon = True
,并调用音调生成函数generate_tone
。但是,我认为我不需要生成多个线程来运行此任务。
请注意,下面的代码是由另一个在后台运行的thread
调用的子模块。后台线程正在传输来自传感器的数据。在下面的代码中,generate_tone
函数产生0.2秒的正弦波音调。如果在不使用线程的情况下调用此函数,则当前线程将花费0.2秒,从而引入0.2秒的延迟。但是,我不希望这种情况发生。我也不想在调用线程之后(即在time.sleep(0.2)
之后使用thread.start()
,因为这样做会再次在循环中引入0.2秒。
此外,请注意下面的代码将不会产生任何声音,因为在执行前一个线程之前会调用一个新线程。但是,它将在调用threading.enumerate()
时打印所有线程。
import pyaudio
import wave
import numpy as np
import math
import threading
def play_tone(stream, frequency=440, length=1, rate=44100):
chunks = []
chunks.append(sine(frequency, length, rate))
chunk = np.concatenate(chunks) * 0.25
stream.write(chunk.astype(np.float32).tostring())
def generate_tone():
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paFloat32,
channels=1, rate=44100, output=1)
play_tone(stream,length=0.20)
stream.close()
p.terminate()
def sine(frequency, length, rate):
length = int(length * rate)
factor = float(frequency) * (math.pi * 2) / rate
return np.sin(np.arange(length) * factor)
def detect_event():
T = 0.1
iter = 0
iter_max = 10
while iter < iter_max:
# some random vector x
x = np.random.rand(10,)
# check if any element of x is greater than T
if len(x[ np.where( x >= T ) ]) != 0:
beep_thread = threading.Thread(target=generate_tone,args=(),daemon=True)
beep_thread.start()
print(threading.enumerate())
iter = iter + 1
if __name__ == '__main__':
detect_event()