创建后台进程以在后台运行函数而不使用线程

时间:2019-02-16 22:15:55

标签: python numpy python-multiprocessing python-multithreading

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

0 个答案:

没有答案