2013-07-27 4 views
1

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

Я попытался питон MultiProcessing модуля, в нить модуля и продевал модуль. Но все это требовало от меня ждать завершения процесса или потока. Я хочу что-то, что позволит мне запускать функции в фоновом режиме. Они должны вызывать некоторую функцию обратного вызова, если происходит определенное событие.

Надеюсь, я найду эффективный способ сделать это.

Я пробовал резьба модуль. Код выглядел следующим образом (псевдокод):

def detected(text): 
    commands = 'a list of commands' 
    if text in commands: 
     #call some function according to the command 

def speech_recognition(): 
    #while True: 
     #If speech detected: 
      #record it 
      #process it and covert it to text 
      #if text is a specified command: 
       #call the detected(text) function with the recognized text as argument 

import threading as t 

pr = t.Thread(target=speech_recognition) 
pr.start() 

#from here starts the main program that does some other functions that 
#doesn't need to be mentioned here. 

Но это не работает. Распознавание речи выполняется в течение нескольких секунд, а затем просто завершается. Исключений нет, никаких систем не выходит, ничего. Это то же самое, когда я пробую многопроцессорную обработку и thread.

+0

Что вы подразумеваете, модуль потоковой передачи требует, чтобы вы дождались окончания потока? Вам остается только подождать, если вы вызовете 'join()' в потоке, но если вы этого не сделаете, вы можете сделать другие вещи в основном потоке. –

+0

Я отредактировал сообщение. Просто взгляните. – freeMinder

ответ

0

Просто используйте threading и передайте свою нить как функциональный дескриптор для вызова, когда у него есть готовые данные или дескриптор приложения в случае приложений GUI, чтобы поток мог создать событие с прикрепленными данными.

2

Я не знаю, как распознавание речи с высокой интенсивностью процессора, но я уверен, что проблема, которую вы описываете, лучше всего решать с максимальной развязкой между объектами, т. Е. Разделение в процессах. Простой сценарий: один из ваших процессов запускает вашу «основную программу», другой процесс полностью отвечает за распознавание речи. Затем вы реализуете протокол связи между этими процессами. «Основная программа» по-прежнему нуждается в какой-то системе событий и асинхронном исполнении на основе threading, поскольку она должна быть способна слушать и сразу реагировать на события, отправленные рече-реком-процессом. Следовательно, рабочая модель будет содержать:

  • один основной процесс, который не должен быть CPU переплете
  • один дочерний процесс, породил через multiprocessing, обработка распознавания речи
  • протокол связи позволяет передавать данные/события между основным и дочерним процессом
  • один дополнительный поток в основной процесс, который ждет событий, посланных дочернего процесса и гарантирует, что основная программа реагирует соответственно

Главный и дочерний процессы запускаются одновременно по расписанию операционной системы. Конечно, это лучше всего работает на системе с по меньшей мере двумя ядрами ЦП. В основном процессе основной поток и другой поток не выполняются синхронно - только один поток может запускаться за один раз из-за блокировки глобального интерпретатора CPython (GIL).

Связь между основным процессом и дочерним процессом может быть реализована с помощью основных инструментов multiprocessing, таких как Queue или Pipe.

Как вы понимаете, вам нужно вложить какую-то серьезную мысль в такую ​​проблему. Не пытайтесь решить эту ошибку & грязной или просто пробной и ошибки. Вы должны убедиться, что понимаете свою саморазвивающуюся архитектуру.

Смежные вопросы