python中的线程面临麻烦
我已经为线程编写了非常基本的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(
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的一致使用