Keyboard一次性打开多个线程

时间:2018-06-16 09:39:58

标签: python multithreading keyboardinterrupt

我目前正在使用多个线程来收集数据并将其保存在JSON中。收集数据的循环是无限的。我希望能够用CTRL + C结束所有线程。因此我用两个循环创建了这个简单版本。我尝试了不同的东西,但到目前为止还无法使它发挥作用。如何使用“除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()

1 个答案:

答案 0 :(得分:1)

这样做的简单方法是让你的线程检查一个全局标志,看看它是否有时间退出。一般原则是你不应该试图杀死线程,你应该让他们退出,这样他们就可以关闭他们可能已经开放的资源。

我修改了你的代码,以便线程(包括原始线程)检查全局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'