В настоящее время я работаю с несколькими потоками для сбора данных и сохранения их в JSON. Цикл для сбора данных бесконечен. Я хочу, чтобы иметь возможность завершить все потоки с помощью CTRL + C. Поэтому я создал эту простую версию с двумя циклами. Я пробовал разные вещи, но не могу заставить его работать до сих пор. Как я могу использовать "except KeyboardInterrupt", чтобы остановить оба цикла одновременно? Или есть лучший вариант?
import threading
from time import sleep
number = 0
numberino = 10
def background():
while True:
if number < 10:
global number
number=number+1
print number
sleep(1)
else:
print "10 seconds are over!"
break
def foreground():
while True:
if numberino > -10:
global numberino
numberino=numberino-1
print numberino
sleep(1)
else:
print "20 seconds are over!"
break
b = threading.Thread(name='background', target=background)
f = threading.Thread(name='foreground', target=foreground)
b.start()
f.start()
Простым способом сделать это, чтобы ваши потоки проверяли глобальный флаг, чтобы узнать, не пришло ли время для выхода. Общий принцип заключается в том, что вы не должны пытаться убивать потоки, вы должны попросить их выйти, чтобы они могли закрыть любые ресурсы, которые они могут открыть.
Я изменил ваш код так, чтобы потоки (включая исходный поток) проверяли глобальный alive
флаг. BTW, вы не должны ставить global
директиву внутри цикла, и она должна быть перед любой ссылкой на глобальную переменную (ы), которую вы хотите изменить. Лучшее место - поставить его в верхней части функции.
import threading
from time import sleep
number = 0
numberino = 10
alive = True
def background():
global number
while alive:
if number < 10:
number += 1
print number
sleep(1)
else:
print "10 seconds are over!"
break
def foreground():
global numberino
while alive:
if numberino > -10:
numberino -= 1
print numberino
sleep(1)
else:
print "20 seconds are over!"
break
b = threading.Thread(name='background', target=background)
f = threading.Thread(name='foreground', target=foreground)
b.start()
f.start()
while alive:
try:
sleep(.1)
except KeyboardInterrupt:
alive = False
print 'Bye'