键盘一次中断多个线程
KeyboardInterrupt multiple threads at once
我目前正在使用多个线程来收集数据并将其保存在 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
标志。顺便说一句,您不应该将 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'
我目前正在使用多个线程来收集数据并将其保存在 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
标志。顺便说一句,您不应该将 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'