2014-07-30 2 views
3

У меня есть функция a, выполняющая некоторые задачи и другая функция b, являющаяся обратным вызовом некоторых событий. Всякий раз, когда происходит событие, вызывается функция b, и я хотел бы, чтобы он смог прервать выполнение функции a. Обе функции объявляются внутри одного класса.Выполнение функции прерывания от другой функции в Python

Функция a не должна называть функцию b. Функция b полностью независима, это обратный вызов внешнего события, такого как «обнаружение лица пользователя», поступающее из ROS: операционной системы робота.

что мне нужно, это в основном что-то вроде Ctrl + C, которое можно вызвать из Python и которое отменяет только целевую функцию, а не всю программу.

Можно ли это сделать на Python?

+0

Как ваш обратный вызов называется? –

+0

Я использую ROS (операционная система робота), где вы можете подписаться на какую-либо функцию для некоторых событий. – Mehdi

+0

Что-то вроде этого ??? CHK = True Защиту function_a(): если CHK: do_process() Защиту function_b(): глобальная CHK CHK = False – Selva

ответ

3

Я хотел бы сделать следующее:

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

Вот некоторые псевдо-код:

class InterruptExecution (Exception): 
    pass 

def function_a(): 
    while some_condition_is_true(): 
     do_something() 
     if callback_time(): 
      try: 
       function_b() 
      except InterruptExecution: 
       break 
     do_something_else() 
    do_final_stuff() 


def function_b(): 
    do_this_and_that() 
    if interruption_needed(): 
     raise (InterruptExecution('Stop the damn thing')) 
+1

спасибо за ваш быстрый ответ, к сожалению, злоупотребление термином «обратный вызов» в моем первоначальном вопросе привело к недоразумениям. функция a не вызывает функцию b. функция b должна иметь возможность прервать функцию a извне. – Mehdi

0

я сделал с помощью Threading.

import threading 
class myThread (threading.Thread): 
    def __init__(self, threadID, name, counter): 
     threading.Thread.__init__(self) 
     self.threadID = threadID 
     self.name = name 
     self.counter = counter 
    def run(self): 
     # Get lock to synchronize threads 
     #threadLock.acquire() 
     if self.name == 'a': 
      function_a(self.name, self.counter, 3) 
     if self.name == 'b': 
      function_b(self.name, self.counter, 3) 

def function_a(threadName, delay, counter): 
    name = raw_input("Name") 
    print name 

def function_b(threadName, delay, counter): 
    global thread1 
    thread1.shutdown = True 
    thread1._Thread__stop() 

# Create new threads 
thread1 = myThread(1, "a", 0) 
thread2 = myThread(2, "b", 0) 

# Start new Threads 
thread1.start() 
thread2.start() 

function_a остановил выполнение, когда thread1 остановлен

0

Обычно рекомендуются не использовать исключение, призывающее управление потоком. Вместо этого посмотрите на python stdlib's threading.Event, даже если вы планируете использовать только один поток (даже в самой базовой программе Python используется хотя бы один поток).

Этот ответ https://stackoverflow.com/a/46346184/914778 имеет хорошее объяснение того, как вызов одной функции (функция b) может прервать другую (функция a).

Вот несколько важных частей, обобщенных из этого другого ответа.

Настройте свои многопоточной библиотеки:

from threading import Event 
global exit 
exit = Event() 

Это хорошая замена для time.sleep(60), так как это может быть прерывание:

exit.wait(60) 

Этот код будет выполняться, пока вы не измените выход на «установить «:

while not exit.is_set(): 
    do_a_thing() 

Это заставит exit.wait(60) прекратить ожидание И exit.is_set() вернется True:

exit.set() 

Это позволит исполнение снова, и exit.is_set() вернется False:

exit.clear() 
Смежные вопросы