【问题标题】:How do I stop the threads once I found my target?找到目标后如何停止线程?
【发布时间】:2016-11-01 05:45:05
【问题描述】:

所以我写了一个 python,它会找到用户输入的 pin,除了一件事之外一切正常,那就是一旦找到 pin,脚本就不会存在。有没有什么原因我可以在找到 pin 后杀死所有其他线程?

#!/usr/bin/env python 
#
#
#
from threading import Thread
from random import randint 
from time import sleep 
from sys import exit
from os import system

system('clear');sleep(0.7)
Pin = int(raw_input('Enter a pin: '))


def Up():
    global Pin
    for pin in xrange(1111,10000):
        system('clear')
        print pin
        if pin == Pin:
            system('clear')
            print 'U Pin Found: %d'%pin;sleep(0.7)
            for i in range(3):
                exit()


def Down():
    global Pin
    pins = xrange(10000)
    for pin in reversed(pins):
        system('clear')
        print pin
        if pin == Pin:
            system('clear')
            print 'D Pin Found: %d'%pin;sleep(0.7)
            exit()



def Random():
    global Pin

    while True:
        pins = randint(1111,10000)
        print pins
        if pins == Pin:
           system('clear')
           print 'R Pin Found: %d'%pins;sleep(0.7)
           exit()


Task1 = Thread(target=Up,args=())
Task2 = Thread(target=Down,args=())
Task3 = Thread(target=Random,args=())


Task1.start()
Task2.start()
Task3.start()

【问题讨论】:

  • 题外话:你清除屏幕的方式不是很便携。考虑使用os.system('cls' if os.name == 'nt' else 'clear') 而不是os.system('clear'),它适用于Windows 和Linux。
  • @martineau 我根本不会这样做。我看不出这样做的意义。
  • @glglgl:我的评论不是写给你的。重点是可移植性。它将允许其他操作系统上的人轻松运行代码(并且可能提供一个很好的问题答案)。
  • @martineau 即使没有针对我发表评论,我也可以随意评论这个话题。毕竟是一个大家可以随意添加cmets的系统。关于便携性,你是完全正确的:如果真的需要清除屏幕,最好是便携。但是我个人觉得一遍又一遍地清屏的程序很烦人,我试图用这个来表达什么。 (我个人更喜欢subprocess 而不是os.system(),但这是另一点。)

标签: python multithreading python-2.7 python-3.x


【解决方案1】:

所有你需要做的就是通过将它们的daemon 属性设置为True 来创建线程对象daemons在启动它们之前

默认值为False。当主程序线程结束时,任何仍在运行的守护线程将自动终止。

在调用它们的构造函数之后这样做是合乎逻辑的:

  ...
Task1 = Thread(target=Up,args=())
Task1.daemon = True
Task2 = Thread(target=Down,args=())
Task2.daemon = True
Task3 = Thread(target=Random,args=())
Task3.daemon = True

Task1.start()
Task2.start()
Task3.start()

【讨论】:

    【解决方案2】:

    您不能简单地终止它们。但是,您可以要求停止。请看示例:

    from threading import Thread
    from random import randint 
    from time import sleep 
    from sys import exit
    from os import system
    
    system('clear');sleep(0.7)
    Pin = int(raw_input('Enter a pin: '))
    
    terminateAll = false
    
    def Up():
        global Pin
        for pin in xrange(1111,10000):
            if terminateAll:
                exit()
            system('clear')
            print pin
            if pin == Pin:
                terminateAll = true
                system('clear')
                print 'U Pin Found: %d'%pin;sleep(0.7)
                for i in range(3):
                    exit()
    
    
    def Down():
        global Pin
        pins = xrange(10000)
        for pin in reversed(pins):
            if terminateAll:
                exit()
            system('clear')
            print pin
            if pin == Pin:
                terminateAll = true
                system('clear')
                print 'D Pin Found: %d'%pin;sleep(0.7)
                exit()
    
    
    
    def Random():
        global Pin
    
        while True:
            if terminateAll:
                exit()
            pins = randint(1111,10000)
            print pins
            if pins == Pin:
               terminateAll = true
               system('clear')
               print 'R Pin Found: %d'%pins;sleep(0.7)
               exit()
    
    
    Task1 = Thread(target=Up,args=())
    Task2 = Thread(target=Down,args=())
    Task3 = Thread(target=Random,args=())
    
    
    Task1.start()
    Task2.start()
    Task3.start()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多