为什么在Python中没有使用多线程的输出?

时间:2013-01-06 04:55:54

标签: python multithreading python-3.x parallel-processing thread-safety

我正在阅读Programming 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
$

有没有人有这方面的想法?

3 个答案:

答案 0 :(得分:1)

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

您需要让主线程等待,直到其他线程完成。 _thread API中没有这方面的规定(它是如此低级别)。

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

答案 1 :(得分: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()方法;非守护程序线程在主线程退出之前自动连接。

答案 2 :(得分:0)

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

import time
time.sleep(5)

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

  • 从每个子线程设置标志,并在退出之前继续检查主线程中的标志(错误方法)。
  • 使用time.sleep睡眠所有子线程可以退出的最长时间(也是一种糟糕的方法)。
  • 使用threading.Thread.join等待每个孩子退出(好的方法)。 (从其他答案中可以看出)