Многозадачность в python

Тема в разделе "Raspberry Pi", создана пользователем chief engineer, 20 июл 2016.

  1. chief engineer

    chief engineer Нерд

    Друзья подскажите как реализовать многозадачность в питоне на примере?

    Чтобы воспроизводилась мелодия и мигали светодиоды одновременно. Очень мало примеров в сети.

    import RPi.GPIO as GPIO
    import time
    import os

    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(21, GPIO.OUT)
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(22, GPIO.OUT)

    while True:

    GPI:confused:utput(21, GPIO.LOW)
    time.sleep(0.2)
    GPI:confused:utput(21, GPIO.HIGH)
    time.sleep(0.2)
    GPI:confused:utput(22, GPIO.LOW)
    time.sleep(0.2)
    GPI:confused:utput(22, GPIO.HIGH)
    time.sleep(0.2)

    os.system('omxplayer /../home/pi/almyra.wav')
     
  2. DZIDBAEV

    DZIDBAEV Нерд

  3. chief engineer

    chief engineer Нерд

    нужно в питоне. хотелось бы простым но верным условием
     
  4. DZIDBAEV

    DZIDBAEV Нерд

    Так и делайте в Пайтоне.....
    Вариантов 2
    Первый
    Мигаете светодиодами очень часто...
    Второй
    Используете какую то логическую схему и передаете биты одним из выходов GPIO
     
  5. Igor68

    Igor68 Гуру

    В документации попадалась такая возможность. И это есть. Но смогу ответить только вечером (после 18:00 по Москве) - с приложением файла описания PYTHON и примером из него. Но мне кажется разумнее это делать на СИ.
    Но если не в терпёж, посмотрите:
    Параллельная многозадачность
    threading - встроенный в python модуль для реализации многозадачности с помощью тредов (объекты языка, выполняющиеся в одном процессе). Минусы подхода в том, что вы не можете загрузить вычислениями более одного ядра.
    multiprocessing - встроенный в python модуль для реализации многозадачности с помощью процессов
    celery - навороченная реализация очереди задач, поддерживающая различные бэкенды для хранения этой самой очереди задач.
    RQ - легковесная очередь задач, использующая redis.
     
  6. DZIDBAEV

    DZIDBAEV Нерд

    chief engineer и Igor68 нравится это.
  7. Arseny

    Arseny Нерд

    в начало поставьте вот это:
    from threading import Thread

    и перед циклом запустите
    Thread(target=os.system('omxplayer /../home/pi/almyra.wav')).start()

    P.S.Импортируйте из библиотек только то, чем будете пользоваться
     
  8. chief engineer

    chief engineer Нерд

    Спасибо за поддержку. конечно буду ждать.
     
  9. Igor68

    Igor68 Гуру

    DZIDBAEV - ответил, точнее дал ссылку на конкретный пункт. У меня документ с этим. Ребята уже достаточно помогли вам. Но вечером смогу доставить свой вариант - вряд ли по смыслу отличается от всего уже показанного.
     
  10. Igor68

    Igor68 Гуру

    Должен огорчить - в подробностях DZIDBAEV ответил куда круче. Но документ - может сгодится:

    book-ods-2_____.pdf

    но я думаю, что как и везде - поток организовывается как цикл, только вот не знаю для оптимального переключения требуется ли sleep как везде или в python всё в автомате. в СИ для переключения потока - sleep (usleep) - постановка в очередь. Правда есть ещё и "отделяемые потоки", которым это требование по барабану - но для работы применять mutex (кстати про очерёдность доступа).
    Простите - я плохо представляю интерпретатор как многозадачную систему - но это есть. И питоном пользуюсь только для испытания методов.
     

    Вложения:

    chief engineer нравится это.
  11. DZIDBAEV

    DZIDBAEV Нерд

    Кстати, как вариант....
    Можно было бы сделать 2 приложения.
    Одно на Сях, которое бы просто воспроизводило музыку.
    Второе бы на пайтоне мигало светодиодами...
    Это в принципе гораздо более удобный вариант
     
  12. Igor68

    Igor68 Гуру

    Простите! Но на Си по моему мнению эффективнее, точнее C+bash.