1

我正在阅读 Python 编程第 4 版。

以下是代码(Python3.2):

import _thread

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

class Power:
    def __init__(self, i):
        self.i = i
    def action(self):
        print(self.i ** 32)

_thread.start_new_thread(action,(2,))
_thread.start_new_thread((lambda: action(2)), ())

obj = Power(2)
_thread.start_new_thread(obj.action,())

当我运行它时,屏幕上没有输出:

$python3 thread-example.py
$

有人对此有想法吗?

4

3 回答 3

1

下划线_表示它是一个私有 API(thread模块自 2005 年以来已过时);您应该改用threading模块:

from threading import Thread

# ...
Thread(target=action, args=[2]).start()
Thread(target=lambda: action(2)).start()
Thread(target=obj.action).start()

您不需要.join()显式调用方法;非守护线程在主线程退出之前自动加入。

于 2013-01-06T05:27:13.030 回答
1

当主线程退出时,整个进程退出。

您需要让主线程等到其他线程完成。API中对此没有任何规定_thread(它太低级了)。

threading.Thread.join()如果您愿意使用更好的 API,可以使用 。

于 2013-01-06T05:03:23.297 回答
0

你为什么不使用threading模块(在这里查看)?在您的示例中,主线程在子线程可以打印任何内容之前退出。例如,如果您在示例末尾添加以下内容,则适用于我的系统:

import time
time.sleep(5)

但是在更复杂的情况下,您仍然不能保证在所有子线程退出之前主线程不会退出。您有以下选择:

  • 从每个子线程设置标志,并在退出前继续检查主线程的标志(不好的方法)。
  • 用于time.sleep休眠所有子线程可以退出的最长时间(也是一种不好的方法)。
  • 用于threading.Thread.join等到每个孩子退出(好方法)。(从其他答案中可以看出)
于 2013-01-06T05:41:52.870 回答