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()