Создание процесса-демона для запуска функции в фоновом режиме без использования потоков - PullRequest
0 голосов
/ 17 февраля 2019

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