2016-01-27 3 views
1

Я работаю над тем, что читает команды из потока данных. Я застрял, пытаясь разработать способ повторного использования неблокирующего обратного отсчета в Python, который срабатывает от триггера. Поэтому я начал небольшую программу с использованием только ввода клавиатуры и некоторой базовой потоковой обработки для разработки логики. Я нашел несколько сообщений, и этот пост (How to create a trigger with threading.Timer?), и это было очень полезно. Но мне нужна помощь с другой стороны.Только триггерный поток при изменении значения (python)

Сейчас моя логика вдоль линий: «Каждый раз, когда значение команды является запуск 1 вызов»

Как обновить свою логику, чтобы быть: «, если значение команды является запуск 1 вызов, не вызывайте старт снова до тех пор, пока значение команды остается равным 1.

Значит, это больше, чем нормальное, если нормальное if/else, или мне нужно отслеживать логическое значение где-то. Я просто не уверен, как Подход к нему

#! /usr/bin/env python 

import time 
import threading 
import random 
from random import randint 
import logging 
from sys import argv 


logging.basicConfig(level=logging.DEBUG, format='[%(levelname)s] (%(threadName)-10s) %(message)s') 

def countdown(pName,command): 
    print("{0} countdown - command{1} ".format(pName,command)) 
    retry = 0 
    while True: 
     print("{0}:{1}".format(pName,retry)) 
     retry += 1 
     if retry > randint(5,10): 
      break 
     time.sleep(1) 
    print("{0} ended".format(pName)) 

def start(pName,command): 
    print("starting countdown for: ",pName) 
    t = threading.Thread(target=countdown,args=(pName,command)) 
    t.setName(pName) 
    t.setDaemon(True) 
    t.start() 


if __name__ == "__main__": 

    while 1: 
     command = int(input("[1 or 2] >")) 
     if command == 1: 
      start("Salad",command) 

     elif command == 2: 
      start("Bingo",command) 

Это довольно грубо прямо сейчас, но это только первое прошлое, чтобы попытаться разобраться с этим.

Спасибо!

+0

Есть ли в потоке флаг, когда он начинается и заканчивается? Запись простых прокси-переменных является потокобезопасной, поэтому просто используйте основной поток, а вспомогательный поток - тот же флаг. Или вы можете использовать блокировку потока в качестве своего флага. – 101

+0

Можете ли вы поднять ответ ниже, если вы получите минуту, пожалуйста? Когда вы говорите флаг, я думаю true/false booleans. Что будет работать, иногда может получиться волосатое. –

+1

Ответ DJ McMayhem в основном использует встроенный флаг, даже лучше! – 101

ответ

1

Вы хотите функцию isAlive. Во-первых, вам придется переместить переменную потока в основную функцию, так что main имеет соответствующую область для вызова thread.isAlive().

if __name__ == "__main__": 
    tSalad = threading.Thread() 
    tBingo = threading.Thread() 
    while 1: 
     command = int(input("[1 or 2] >")) 
     if command == 1 and not tSalad.isAlive(): 
      tSalad = threading.Thread(target = countdown, args=("Salad", 1)) 
      start("Salad", tSalad) 

     elif command == 2 and not tBingo.isAlive(): 
      tBingo = threading.Thread(target = countdown, args=("Bingo", 2)) 
      start("Bingo", tBingo) 

Затем измените функцию «Start», чтобы взять нить аргумент:

def start(pName, t): 
    print("starting countdown for: ",pName) 
    t.setName(pName) 
    t.setDaemon(True) 
    t.start() 

Это должно сделать трюк для вас.

+0

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

+0

@mishap_n хорошо, у вас должно быть * что-то в основном. Я полагаю, вы могли бы сохранить его в классе, но тогда вам нужно было бы сохранить объект этого класса в основном. Однако вы это делаете, главное - видеть потоки. – DJMcMayhem

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