python中的线程面临麻烦

python中的线程面临麻烦,python,multithreading,Python,Multithreading,我已经为线程编写了非常基本的python代码 import time import thread def print_hello(name,delay): while 1: print name time.sleep(delay) try: thread.start_new_thread(print_hello, ("frist",1,)) thread.start_new_thread(

我已经为线程编写了非常基本的python代码

import time
import thread

def print_hello(name,delay):
    while 1:
        print name
        time.sleep(delay)

        try:
            thread.start_new_thread(print_hello, ("frist",1,))
            thread.start_new_thread(print_hello, ("second",2,))
        except:
            print "unable to start thread"

        time.sleep(4)
        print "hello"
哪个输出是:

second
frist
frist
second
frist
frist
hello
例外情况:

Unhandled exception in thread started by 
  sys.excepthook is missing
  lost sys.stderr

Unhandled exception in thread started by 
  sys.excepthook is missing
  lost sys.stderr
我的问题是:

  • 为什么是第二名
  • 为什么会有例外

  • 这是一个无限循环

    print\u hello
    函数启动一个线程,该线程启动一个线程,该线程启动一个线程


    坏事情会发生,最终会崩溃。

    这是一个无限循环

    print\u hello
    函数启动一个线程,该线程启动一个线程,该线程启动一个线程


    糟糕的事情会发生,最终它会崩溃。

    简单的回答:因为线程很棘手

    首先,上面输入的代码不可能产生您显示的输出。我认为您真正想要的是从
    try:
    到与
    def
    相同的级别。当我进行更改并运行您的代码时,有时会得到与您类似的结果

    解决第一个问题:第一个问题排在第二位,因为
    time.sleep()
    不能保证它会精确延迟指定的时间。见文件。 当我运行代码时,有时第一个排在第二位,有时第一个排在第一位,有时它们一起出现

    解决你的第二个问题:因为当主程序退出时,你的两个背景线程会从它们下面拉出地毯

    当主程序执行
    睡眠
    打印
    时,两个线程正常运行。一旦这些操作完成,程序将尝试退出。大约在同一时间,两个线程正在尝试打印它们的输出

    我发现,如果将
    sleep(4)
    增加到
    sleep(5.5)
    它运行得更干净,因为程序退出时,两个线程都没有尝试
    打印

    在现实生活中,您应该使用一种机制来通知后台线程在主程序退出之前中断其infinte循环并退出,然后让主程序等待(通过调用
    join()
    )直到线程在退出之前停止


    阅读和。

    简单的回答:因为线程很棘手

    首先,上面输入的代码不可能产生您显示的输出。我认为您真正想要的是从
    try:
    到与
    def
    相同的级别。当我进行更改并运行您的代码时,有时会得到与您类似的结果

    解决第一个问题:第一个问题排在第二位,因为
    time.sleep()
    不能保证它会精确延迟指定的时间。见文件。 当我运行代码时,有时第一个排在第二位,有时第一个排在第一位,有时它们一起出现

    解决你的第二个问题:因为当主程序退出时,你的两个背景线程会从它们下面拉出地毯

    当主程序执行
    睡眠
    打印
    时,两个线程正常运行。一旦这些操作完成,程序将尝试退出。大约在同一时间,两个线程正在尝试打印它们的输出

    我发现,如果将
    sleep(4)
    增加到
    sleep(5.5)
    它运行得更干净,因为程序退出时,两个线程都没有尝试
    打印

    在现实生活中,您应该使用一种机制来通知后台线程在主程序退出之前中断其infinte循环并退出,然后让主程序等待(通过调用
    join()
    )直到线程在退出之前停止


    阅读和。

    有些人在遇到问题时会想“我会使用线程”。有些人在遇到问题时会想“我会使用线程”。然后他们两个都没有问题。你好,我是个新手。我明白了这一点,但我也有一些基本的疑问,线程实际上是如何工作的?是不是所有的线程都分配给了一个单独的堆栈,我很奇怪为什么程序执行停止后线程就停止了。@user2743375我对内部细节知之甚少。也许这个问题()会有帮助。+1对于“first”的一致使用:DHello,我对threding程序是新手。我明白了这一点,但我也有一些基本的疑问:线程实际上是如何工作的?是不是所有的线程都分配给了一个单独的堆栈,我很奇怪为什么程序执行停止后线程就停止了。@user2743375我对内部细节知之甚少。也许这个问题()会有帮助。+1用于“first”:D的一致使用