13

我正在关注简单线程的教程。他们给出了这个例子,当我尝试使用它时,我从解释器那里得到了难以理解的错误。你能告诉我为什么这不起作用吗?我正在使用带有 Python 2.6 的 WinXP SP3

import thread

def myfunction(mystring,*args):
    print mystring


if __name__ == '__main__':

    try:

        thread.start_new_thread(myfunction,('MyStringHere',1))

    except Exception as errtxt:
        print errtxt

执行这会导致::

由 sys.excepthook 中的错误启动的线程中未处理的异常:

原来的例外是:

错误中缺少的信息实际上在输出中丢失了。

4

5 回答 5

25

问题是您的主线程在您的新线程有时间完成之前已经退出。解决方案是在您的主线程处等待。

import thread, time

def myfunction(mystring,*args):
    print mystring


if __name__ == '__main__':

    try:

        thread.start_new_thread(myfunction,('MyStringHere',1))

    except Exception, errtxt:
        print errtxt

    time.sleep(5)

附带说明一下,您可能想要使用 threading 模块。您的主线程将等待所有这些类型的线程在退出之前关闭:

from threading import Thread

def myfunction(mystring,*args):
    print mystring


if __name__ == '__main__':

    try:
        Thread(target=myfunction, args=('MyStringHere',1)).start()
    except Exception, errtxt:
        print errtxt
于 2009-05-11T19:53:08.623 回答
17

你需要等到你的 Thread 完成它的工作,所以你必须使用 Thread.join() :

from threading import Thread

def myfunction(mystring,*args):
    print mystring

if __name__ == '__main__':

    try:
        t = Thread(None,myfunction,None,('MyStringHere',1))
        t.start()
        t.join()
    except Exception as errtxt:
        print errtxt
于 2009-05-11T20:19:04.917 回答
1
import thread

def myfunction(mystring,*args):
    print mystring

if __name__ == '__main__':

    try:

        thread.start_new_thread(myfunction,('MyStringHere',1))

    except Exception as errtxt:
        print errtxt

while 1:
    pass

最后放 while 循环然后它会为你工作。

于 2013-12-17T11:38:56.107 回答
0

更改后,我在 Mac 上的 Python 2.5 中尝试过

except Exception as errtxt:

except Exception, errtxt:

该程序没有抛出异常,但也没有打印任何内容。不确定这是否有帮助,但我确实觉得它很好奇......

于 2009-05-11T19:38:35.730 回答
-1

当我在 Python 2.6 中运行此代码时,它起作用了,您是否有可能已经打开了锁定在该函数上的线程?我建议完全关闭 Python,检查正在运行的进程以确保没有任何进程在运行,然后重试。

于 2009-05-11T19:38:51.220 回答