Как передать аргументы функциям потока в Python - PullRequest
0 голосов
/ 20 июня 2020

У меня есть raspberry pi, где я использую python для создания небольшого скрипта зуммера. В сценарии, если условие становится True, мне нужно распечатать некоторую информацию, а также сделать звуковой сигнал. Звуковые сигналы зуммера имеют два разных формата: High и Low. В High я должен запустить код ниже:

GPIO.output(BUZZER, 1)
time.sleep(5)
GPIO.output(BUZZER, 0)
GPIO.cleanup()

, чтобы зуммер издавал непрерывный звук в течение 5 секунд c. В Low мне нужно запустить следующий код:

for i in range(5):
    print(i)
    state = GPIO.input(BUZZER)
    print("state is {}".format(state))
    GPIO.output(BUZZER, 1)
    time.sleep(0.3)

    state = GPIO.input(BUZZER)
    print("state is {}".format(state))
    GPIO.output(BUZZER, 0)
    time.sleep(0.3)

Он издаст 5 звуковых сигналов.

Ниже приведен сценарий python:

def generate_sound(tempo):
    if tempo == "High":
        GPIO.output(BUZZER, 1)
        time.sleep(5)
        GPIO.output(BUZZER, 0)
        GPIO.cleanup()
    else:
        for i in range(5):
            state = GPIO.input(BUZZER)
            print("state is {}".format(state))
            GPIO.output(BUZZER, 1)
            time.sleep(0.3)

            state = GPIO.input(BUZZER)
            print("state is {}".format(state))
            GPIO.output(BUZZER, 0)
            time.sleep(0.3)



if some_condition is True:
    generate_sound("High")
    print("This condition is True")
    print("Here is the information you need")
    print("Some more information")

else:
    generate_sound("Low")
    print("This condition is False")
    print("Here is the information you need")
    print("Some more information")

Приведенный выше код работает нормально, но проблема в том, что мне нужно отображать информацию и генерировать звук одновременно. Но при текущем подходе звук генерируется и ждет 5se c, а затем информация печатается.

Чтобы решить эту проблему, я хотя бы поместил функцию генерации звука в поток, чтобы он мог работать параллельно с информацией для печати, примерно так:

sound = Thread(target=generate_sound)

Но здесь я не уверен, как передать значения High и Low для создания звуковой функции. Я не очень разбираюсь в потоках. Кто-нибудь может дать мне несколько идей. Пожалуйста помоги. Спасибо

1 Ответ

1 голос
/ 20 июня 2020

Помилование; рефлексивная привычка есть. Библиотека потоковой передачи, в частности, предлагает вам прямое решение, поэтому обходной путь ниже строки не требуется.

См. Документацию по потокам :

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, \*, daemon=None)

[...]

args - это кортеж аргументов для целевого вызова. По умолчанию ().

Таким образом, мы можем просто указать args при необходимости:

# Note the comma in `('High',)`; we want a 1-element tuple.
sound = Thread(target=generate_sound, args=('High',))

Но здесь я не уверен, как передать значения High и Low для генерации звуковой функции.

Это не зависит от понимания потоковой передачи; это общая техника для такого рода функций обратного вызова (в основном, каждый раз, когда вы передаете функцию в качестве параметра чему-то другому). Например, часто вам нужен этот метод для кнопок при создании GUI с помощью tkinter (или других инструментов).

Привяжите параметр к вызову, например, используя functools.partial from стандартная библиотека:

from functools import partial
sound = Thread(target=partial(generate_sound, 'High'))
...