Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 5, 2012 10:12:56

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Выполнение скрипта при наличии файла в директории

Можно использовать потоки. В главном крутится код для работы с файлами, во втором, например, консоль ждет слова close для завершения работы

import time
import threading
FLAG_EXIT = False
def main():
    while not FLAG_EXIT:
        print 'ваш код в этот блок'
        time.sleep(3)
    print 'выход из цикла'
    
    
def thrInput():
    global FLAG_EXIT
    while 1:
        if raw_input('>>>').lower() == "close":
            FLAG_EXIT = True
            print 'ожидание завершения операции с файлом'
            return
        else:
            print 'write "close"'
            
t = threading.Thread(target=thrInput)
t.start()
main()
t.join()

вместо консоли можно использовать гуи, ждать команды через сокет етс.



Офлайн

#2 Сен. 5, 2012 14:33:18

Senhion
Зарегистрирован: 2012-08-13
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

Выполнение скрипта при наличии файла в директории

sp3
Можно использовать потоки. В главном крутится код для работы с файлами, во втором, например, консоль ждет слова close для завершения работы

Спасибо огромное - этот пример прям почти то что нужно, а про потоки в python подробнее где можно почитать? для того что бы я не задавал глупых вопросов про t.start и t.join

Офлайн

#3 Сен. 5, 2012 17:26:07

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Выполнение скрипта при наличии файла в директории

Офлайн

#4 Сен. 11, 2012 13:13:24

Senhion
Зарегистрирован: 2012-08-13
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

Выполнение скрипта при наличии файла в директории

Господа в теме потоков пока плаваю.
Объясните пожалуйста что делает метод .join() ?
в описалове к нему если кратко то: Поток, который вызывает этот метод, приостанавливается, ожидая завершения потока, чей метод вызван.
т.е. если я пишу t.join() то поток t приостанавливается и? что происходит дальше?

Офлайн

#5 Сен. 11, 2012 14:04:17

minotavr_x86
От:
Зарегистрирован: 2010-05-21
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

Выполнение скрипта при наличии файла в директории

Я бы сделал через сигналы

import signal
from time import sleep
def stop(signum, frame):
    while True:
        if a == 'not_file':
            raise IOError
        sleep(4)
signal.signal(signal.SIGINT, stop)
signal.signal(signal.SIGTERM, stop)
try:
    while True:       
        a = 'work'
        #какая то обработка файла
        sleep(1000)
        a = 'not_file'
        sleep(10)            
except IOError:
    print 'Stop server'



Офлайн

#6 Сен. 11, 2012 18:13:51

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Выполнение скрипта при наличии файла в директории

Senhion
т.е. если я пишу t.join() то поток t приостанавливается и? что происходит дальше?
приостанавливается не поток t, а тот из которого ты вызываешь t. В твоем случае приостанавливается главный поток и ждет пока t умрет.
Если что то непонятно, наставь везде принтов до полного просветления как это работает
import time
import threading
    
    
def thrInput():
    print 'поток стартует'
    time.sleep(5)
    print 'поток сейчас умрет'
            
t = threading.Thread(target=thrInput)
print 'делаем start'
t.start()
time.sleep(2)
print 'делаем join'
t.join()
print 'конец программы'



Офлайн

#7 Сен. 12, 2012 02:35:19

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10019
Репутация: +  857  -
Профиль   Отправить e-mail  

Выполнение скрипта при наличии файла в директории

Senhion
Объясните пожалуйста что делает метод .join() ?
не даёт вызывающему потоку завершиться раньше вызываемого



Офлайн

#8 Сен. 12, 2012 13:21:37

Senhion
Зарегистрирован: 2012-08-13
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

Выполнение скрипта при наличии файла в директории

т.е. в коде

t = threading.Thread(target=thrInput)
t.start()
main()
t.join()

функция main() запускается в главном потоке? но пока она не отработает мы не сможем выполнить t.join()?
а если сможем то тогда выполнение main() приостановится?

Офлайн

#9 Сен. 12, 2012 15:17:22

minotavr_x86
От:
Зарегистрирован: 2010-05-21
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

Выполнение скрипта при наличии файла в директории

Senhion
функция main() запускается в главном потоке? но пока она не отработает мы не сможем выполнить t.join()?
а если сможем то тогда выполнение main() приостановится?
Функция main выполнится и поcле этого главный поток ждет завершения потока t



Отредактировано minotavr_x86 (Сен. 12, 2012 15:17:47)

Офлайн

#10 Сен. 13, 2012 17:31:02

Senhion
Зарегистрирован: 2012-08-13
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

Выполнение скрипта при наличии файла в директории

Хм… все равно что то буксую

import threading
FLAG_STOP = False
def thrInput():
    global FLAG_STOP
    while True:
        if raw_input('<<<').lower() == "close":
	    FLAG_STOP = True
            return
 t1 = threading.Thread(target = thrInput)
 t1.start()
 while not FLAG_STOP:
    a = a + 1
    print a

и собственно хочу увидеть поток цифер до того как я с клавиатуры введу close
а получается, что выполняется один цикл и дальше все стоит и ждет ввода если ввод происходит то выполняется еще один цикл… вроде все понятно… а как сделать то что я хочу?

Отредактировано Senhion (Сен. 14, 2012 10:13:33)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version