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

2024-04-20 07:44:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我在读编程Python第四版。在

以下是代码(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,())

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

^{pr2}$

有人对此有什么想法吗?在


Tags: lambda代码importselfobjnewinitdef
3条回答

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

import time
time.sleep(5)

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

  • 设置每个子线程的标志,并在退出前检查主线程的标志(错误的方法)。在
  • 使用^{}来休眠所有子线程退出所需的最长时间(这也是一种错误的方法)。在
  • 使用^{}等待每个子进程退出(好方法)。(从其他答案可以看出)

下划线_表示它是一个私有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()方法;在主线程退出之前,非守护进程线程会自动加入。在

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

您需要让主线程等待其他线程完成。在_threadAPI中没有这方面的规定(它太低级了)。在

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

相关问题 更多 >