Форум сайта python.su
В скрипте выполняются три функции каждая в своём потоке
Две из них бесконечновыполняемые, а третья просто очень долго выполняется
При нажатии CTRL+C выполнение функций не прерывается…
Помогите пожалуйста решить проблему
Пример кода:
import os, sys, threading, time from threading import Thread class test1(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.kill_received = False def run(self): while not self.kill_received: self.do_something() def do_something(self): #avtotest(2, '') [i*i for i in range(10000)] print(1) time.sleep(1) class test2(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.kill_received = False def run(self): while not self.kill_received: self.do_something() def do_something(self): [i*i for i in range(10000)] print(2) time.sleep(1) class test3(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.kill_received = False def run(self): while not self.kill_received: self.do_something() def do_something(self): func() def func(): for i in xrange(10000): print(3) time.sleep(1) def main(args): t1 = test1() t2 = test2() t3 = test3() t1.start() t2.start() t3.start() while True: try: time.sleep(1.0) except KeyboardInterrupt: print "Ctrl-c received! Sending kill to threads..." t1.kill_received = True t2.kill_received = True t3.kill_received = True break stop=raw_input('Stop test (y/n) ?: ') if __name__=="__main__": main(sys.argv)
Офлайн
kill_received это странный флаг, чаще берут что-то вроде finishing, terminated и т.д. У `test1` и у `test2` относительно короткий цикл, примерно секунда и они более-менее сразу завершатся, а вот `test3` только по истечении без четверти трёх часов (10'000 сек.).
Как вариант, потокам можно выставлять свойство `daemon`, тогда они будут прерываться вместе с завершение процесса (если ты в потоке не успел дописать файл или ещё чего такого, то ты сам себе злобный буратино).
Вообще шрифт полное говно, но выскажусь хотя бы по одному пункту. Лучше не менять так атрибуты (kill_received = True), сделай метод и вызывай его:
class test1(threading.Thread): terminated = False def kill(self): self.terminated = True def run(self): while not self.terminated: pass
Отредактировано bw (Авг. 2, 2013 09:02:09)
Офлайн