0

我希望有人能快速简单地解决我面临的这个问题。我正在阅读 Mark Lutz 编写的 Programming Python 书第 4 版的第 5 章,从第 189 页开始我遇到了一些麻烦。基本上,有一个非常简单的示例:

import _thread
def action(i):
    print(i ** 32)

_thread.start_new_thread(action, (2, ))

出于某种原因,这个脚本不会在我运行 Ubuntu 12.04 的电脑上产生任何输出,但会在我的 Windows 7 机器上产生。从终端运行时的输出是:

un@homepc:~/Desktop/pp$ python3.2 thread1.py
un@homepc:~/Desktop/pp$ 

任何帮助将非常感激。

谢谢。

4

2 回答 2

0

感谢 Ramchandra 为我指明了正确的方向。问题是程序正在结束并杀死线程。如果我运行这个:

import time, _thread

def print_t(name, delay):
    while True:
        try:
            time.sleep(delay)
            print(name)
        except: pass

_thread.start_new_thread(print_t, ("First Thread", 1,))
_thread.start_new_thread(print_t, ("Second Thread", 2,))

while True:
    try: pass
    except KeyboardInterrupt:
        print("Ending main program")
        break

...然后程序按计划执行。我不知道为什么原始帖子中的代码可以在 Windows 7 上运行,但不能在 ubuntu 12.04 上运行。那好吧。希望这对某人有所帮助。

于 2012-08-22T04:11:01.337 回答
0

我不是线程专家,但这很可能是问题所在:

运行此代码时,Python 在最后一行之后无事可做;因此它强制结束线程退出(无论它是否完成)。根据线程的运行方式,线程可能会完成,也可能不会。(不可靠的行为)

主线程伪代码指令:

创建新线程

新线程:

行动(2)

主线程下一条指令:

程序结束;退出

固定代码:

import _thread
def action(i):
    print(i ** 32)
    action_lock.release() #Now Python will exit

#locks are a part of threaded programming; if you don't know what it is, you can google it.
action_lock = _thread.allocate_lock() #set a lock for the action function thread
action_lock.acquire() #Acquire the lock
_thread.start_new_thread(action, (2, ))
action_lock.acquire()
于 2012-08-21T14:49:29.877 回答