LINUX.ORG.RU

Ответ на: комментарий от mannaz

В том месте где я её запускаю нет крестиков.

zahardzhan
() автор топика

Лови SIGINT и делай с ним, что душе угодно.

const86 ★★★★★
()

hint: Thread.daemon

from threading import Thread
from time import sleep

def run():
    while(True):
        print "I'am work"
        sleep(1)
            
thread = Thread(target=run)
thread.daemon = True
thread.start()

while(True):
    sleep(1)

baverman ★★★
()
Ответ на: комментарий от baverman

Пробовал ловить SIGINT - не ловится:

if __name__ == '__main__':
    
    def interrupt_handler(signal, frme):
        print 'Работа программы прервана.'
        sys.exit()

    signal(SIGINT, interrupt_handler)

    main() # Здесь много потоков

zahardzhan
() автор топика
Ответ на: комментарий от zahardzhan

думаю есть решение и получше

Что значит получше?

Лучше — это только руками останавливать каждый поток

from threading import Thread
from time import sleep

class MyThread(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.interrupt = False

    def run(self):
        while(not self.interrupt):
            print "I'am work"
            sleep(1)
            
    def stop(self):
        self.interrupt = True
            
thread = MyThread()
thread.start()

while(True):
    try:
        sleep(1)
    except KeyboardInterrupt:
        break
        
thread.stop()
baverman ★★★
()

Я в свое время сделал так (в главном треде перед стартом остальных): signal.signal(2, lambda x, y: exit(1))

Вроде нормально все прерывалось

provaton ★★★★★
()
Ответ на: комментарий от baverman

От такого ручного останова толку нет:

def run(self):
    while(not self.interrupt):
        print "I'am work"
        sleep(1)
Заместо принта в цикле будет вычисление длящееся несколько часов.

zahardzhan
() автор топика

Почему много тредов, а не процессов?

dimon555 ★★★★★
()
Ответ на: комментарий от zahardzhan

> Заместо принта в цикле будет вычисление длящееся несколько часов.

Если у вас числодробилка, то использование thread'ов вам не даст прироста скорости, скорее наоборот проиграете из-за GIL.

Лучше используйте http://docs.python.org/dev/library/multiprocessing.html

ntp
()
Ответ на: комментарий от ntp

Заместо принта в цикле будет вычисление длящееся несколько часов.

Это сетевой ввод-вывод. Просто, я его реализовал как дерево из окружений, в которых агенты грузят файлы. Каждое окружение наследует от Thread, итого получается дерево нитей, где все окружения работают параллельно:

Окружение
--Агент
--Агент
--Окружение
----Агент
--Окружение
----Агент
----Агент
И вот нужно чтобы по прерыванию все они останавливались, ну или заканчивали работу.

zahardzhan
() автор топика
Ответ на: комментарий от zahardzhan

> От такого ручного останова толку нет

> ...в цикле будет вычисление длящееся несколько часов


> Это сетевой ввод-вывод


что-то здесь не сходится

mannaz
()
Ответ на: комментарий от zahardzhan

> где все окружения работают параллельно

В CPython треды работают последовательно.

ntp
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.