Обновление параметров в Python во время бесконечного цикла - PullRequest
1 голос
/ 15 мая 2010

Я надеялся получить помощь по вопросу. У меня есть бесконечный цикл, который мне нужно запустить, и мне нужно обновлять набор переменных (в данном случае x) в случайное время из командной строки. Есть какой-либо способ сделать это?

Например:

x = 0
while True:
 x  = x + 1 
 if x < 30:
  do something

и мне нужно периодически обновлять значение x из командной строки

Ответы [ 4 ]

2 голосов
/ 15 мая 2010

Мне кажется, что лучший способ реализовать это - использовать поток вместо бесконечного цикла и использовать

notify()

метод указания, когда обновлять данные из командной строки

Вот хорошее руководство для начала:

http://docs.python.org/library/threading.html

1 голос
/ 15 мая 2010

Это довольно грубо, но довольно мило:

import code
import signal
import time
def signal_handler(signal, frame):
    code.interact(local=globals())
signal.signal(signal.SIGINT, signal_handler)

x=0
while True:
    x  = x + 1
    time.sleep(0.01)
    if x < 30:
        print(x,'do something')

Когда вы нажимаете Ctrl-C, вы попадаете в интерпретатор Python. Там вы можете набирать операторы Python вроде

x=10

Нажатие Ctrl-D возобновляет выполнение.

0 голосов
/ 16 мая 2010

Мое решение с использованием потоков и базового механизма блокировки.

from threading import Thread,Lock

lock = Lock()

def read():
    global x
    x = 0
    while True:
        lock.acquire()
        try:
            x  = x + 1 
        finally:
            lock.release()
        if x < 30:
            #do something


def update():
    global x
    while True:
        cmd_input = int(raw_input())
        lock.acquire()    
        try:
            x = cmd_input
        finally:
            lock.release()

if __name__=='__main__':
    update_t = Thread(target=update,args=())
    read_t = Thread(target=read,args=())
    update_t.start()
    read_t.start()
0 голосов
/ 15 мая 2010

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

 echo "NewValue" > file.txt

Файлы будут работать здесь, хотя что-то вроде каналов будет более подходящим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...