2016-11-10 3 views
0

У меня есть поток, где я использую событие потока для управления потоком из-за пределов целевой функции.Python Threading Event

flag = threading.event() 

В моей целевой функции, у меня есть что-то вроде этого:

def functionname(arguments): 
    flag.clear() 
    while not flag.wait(timeout = 0.5): 
     # do something. 

всякий раз, когда я хочу, чтобы вернуть нить, из моей основной функции я говорю, flag.set(). Тогда флаг имеет значение true, моя целевая функция завершает выполнение и поток завершается.

Теперь, если я хочу использовать flag.wait (timeout = 5) в своей основной функции, я ожидаю блокировать и ждать пять секунд, чтобы выполнить часть кода «сделать что-то». Однако я вижу, что «делать что-то» часть кода выполняется каждые 0,5 секунды, как обычно, и моя основная функция блокируется на пять секунд.

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

PS: Я определил событие флага в моей главной функции и передал его в качестве аргумента целевой функции

+0

Я запутался .... вы 'flag.wait (тайм-аут = 5)', и вы хотите, чтобы сделать нить в 'flag.wait (таймаут = 0,5)' подождите 5 секунд вместо ? Это не работает. Тайм-аут основной нити не зависит от ребенка. Какова ваша цель? Вы пытаетесь контролировать, как долго ребенок ждет в основном потоке? – tdelaney

+0

flag.wait (timeout = 0.5) изначально записывается, когда я хочу, чтобы целевая функция запускалась каждые 0,5 секунды. Теперь, если я хочу изменить его на 5 секунд, я использую flag.wait (5). Флаг - это событие с потоком, которое должно выполняться только для целевой функции, а не для основного потока. –

ответ

0

Многих потоков могут ждать на мероприятии в то же время и как долго ждет, прежде чем тайм-аут не зависит от как долго другие делают. Если вы хотите, чтобы время ожидания вашего потока изменилось с 0,5 до 5 секунд, вам нужно каким-то образом сообщить потоку изменить значение, которое оно передает в параметре таймаута. Это похоже на хорошую работу для общей переменной - поток считывает таймаут из переменной и main может изменить эту переменную.

Но где вы его выразились? Ну, существуют экземпляры классов для хранения связанных данных, поэтому класс, содержащий событие и текущее значение таймаута, является разумным. Фактически, вы можете просто использовать наследование для выполнения задания. Обратите внимание, что в этом примере тайм-аут изменяется только для следующего интервала - поток ожидает текущее время ожидания перед использованием обновленного значения. Получение немедленного изменения значительно сложнее, и я не хотел путать этот вопрос.

import threading 
import time 

class VariablyTimedEvent(threading.Event): 

    def __init__(self, initial_timeout=None): 
     super().__init__() 
     self.timeout = initial_timeout 

    def wait(self): 
     return super().wait(timeout=self.timeout) 

# ------------- test ----------------- 

def functionname(event): 
    event.clear() 
    while not event.wait(): 
     do_something() 
    print('event set, exiting') 

_do_something_start = time.time() 
def do_something(): 
    # a mock object that shows time since program start 
    print('%03.1f: do something' % (time.time() - _do_something_start)) 

print("start timing at .5 second") 
event = VariablyTimedEvent(.5) 
thread = threading.Thread(target=functionname, args=(event,)) 
thread.start() 
time.sleep(3.1) 
print("change timeout to 2 seconds") 
event.timeout = 2 
time.sleep(7) 
print("exit the thread") 
event.set() 
thread.join()