Multithreading 如果python中出现键盘异常,如何停止子线程?

Multithreading 如果python中出现键盘异常,如何停止子线程?,multithreading,python-2.7,keyboardinterrupt,Multithreading,Python 2.7,Keyboardinterrupt,我面临着线程概念的问题,即我有一个函数,它将创建10个线程来完成任务。如果发生任何键盘中断,这些创建的线程仍在执行,我想停止这些线程并恢复更改 以下代码sinppet是示例方法: def store_to_db(self,keys_size,master_key,action_flag,key_status): for iteration in range(10): t = threading.Thread(target=self.store_worker, args=(

我面临着线程概念的问题,即我有一个函数,它将创建10个线程来完成任务。如果发生任何键盘中断,这些创建的线程仍在执行,我想停止这些线程并恢复更改

以下代码sinppet是示例方法:

def store_to_db(self,keys_size,master_key,action_flag,key_status):
    for iteration in range(10):
        t = threading.Thread(target=self.store_worker, args=())
        t.start()
        threads.append(t)
    for t in threads:
        t.join()

def store_worker():
    print "DOING"

实现这一目标的想法是:

  • 您需要一个“线程池”,线程在此检查其
    do\u run
    属性是否为false
  • 您需要一个池外的“sentinel线程”,它检查池中的线程状态,并根据需要调整“线程池”线程的
    do\u run
    属性
示例代码:

导入线程
随机输入
导入时间
将msvcrt作为ms导入
def main_逻辑()
#取10个工作线程
线程=[]
对于范围(10)内的i:
t=threading.Thread(target=long\u process\u,带制动器,args=(i,))
#开始和附加
t、 开始()
threads.append(t)
#启动允许您停止上面定义的所有线程的线程
线程(target=sentinel,args=(threads,))
s、 开始()
#连接工作线程
对于螺纹中的t:
t、 加入
def sentinel(线程):
#此操作将一直运行,直到“线程”中定义的线程正在运行或按下键盘为止
尽管如此:
#正在运行的线程数
running=[x代表线程中的x,如果x.isAlive()]
#如果按kb键
如果kbhit女士():
#告诉线程停止
对于运行中的t:
t、 do_run=False
#如果所有线程都已停止,则退出循环
如果未运行:
打破
#你不想一无所有的高cpu负载
睡眠时间(0.05)
带制动器的def流程(工人id):
#抓取当前线程
t=threading.currentThread()
#开始味精
打印(f“{worker_id}已开始”)
#退出条件
zzz=random.random()*20
停止时间=time.time()+zzz
#想象一下这里的迭代,如“for item in items:”
while time.time()<停止时间:
#刹车
如果不是getattr(t,“do_run”,True):
打印(f“{worker_id}正在转义”)
返回
#任务
睡眠时间(0.03)
#退出消息
打印(f“{worker_id}DONE”)
#退出消息
打印(f“{worker_id}DONE”)
主逻辑
此解决方案不会“杀死”线程,只是告诉它们停止迭代或执行任何操作

编辑: 我只是注意到标题中有“键盘异常”,而不是“任何键”。因此,键盘异常处理有点不同。要点几乎是一样的:如果满足条件,则告诉线程返回