【问题标题】:Using Thread.join() method with threads that inside inside a class对类内部的线程使用 Thread.join() 方法
【发布时间】:2021-10-25 17:06:25
【问题描述】:

我正在解决 LeetCode 的这个问题:1116. Print Zero Even Odd

我在 VS Code 中使用我自己的 main 函数运行此 solution 以深入了解该问题。

阅读此question 和建议的解决方案后。除了阅读这个explanation

我将此代码添加到解决方案的代码中:

from threading import Semaphore
import threading

def threaded(fn):
    def wrapper(*args, **kwargs):
        threading.Thread(target=fn, args=args, kwargs=kwargs).start()
    return wrapper

在我添加的问题中的这些功能之前:@threaded

我添加了一个 printNumber 函数和 main 函数来在 VS Code 上运行它。

def printNumber(num):
    print(num, end="")

if __name__ == "__main__":
    a = ZeroEvenOdd(7)
    handle = a.zero(printNumber)
    handle = a.even(printNumber)
    handle = a.odd(printNumber)

运行此代码给了我一个正确的答案,但之后我没有在终端中打印出新的一行,我的意思是在我的主函数中输入7,输出是:01020304050607主机名 而不是我想要的:

01020304050607

主机名

所以,我在 main 中添加了print("\n"),我看到我得到了一个随机输出,例如:

0102

0304050607

0

1020304050607

最后还是没有换行。

当我尝试使用连接函数handle.join() 时,我得到了错误:

发生异常:AttributeError 'NoneType' 对象没有 属性“加入”

我尝试过这样做:

handle1 = a.zero(printNumber)
handle2 = a.even(printNumber)
handle3 = a.odd(printNumber)
handle1.join()
handle2.join()
handle3.join()

仍然出现同样的错误。 我应该在代码中的哪个位置等待线程终止?

谢谢。

【问题讨论】:

  • 投票结束,因为问题中没有足够的信息。下面的答案解释了错误消息的含义,但是 OP 似乎仍然感到困惑,并且没有提供足够的代码示例来说明使他们感到困惑的原因。
  • @SolomonSlow 但是我发布了我所依赖的代码,这是链接中的解决方案,此外我发布了我编写的在 VS Code 中运行此解决方案的代码。我可以发布整个代码,它将是上述两者的结合。

标签: python multithreading wrapper


【解决方案1】:

当我尝试使用...handle.join()...时出现错误:“...'NoneType' 对象没有属性,'join'

错误消息意味着在您的代码尝试调用handle.join() 的程序中,handle 的值是NoneNone 值上没有可用的 join() 操作。

你可能想join()一个线程(即Threading.thread(...)返回的对象。对于单个线程,你可以这样做:

t = Threading.thread(...)
t.start()
   ...
t.join()

您的程序创建了 三个 线程,因此您不能只使用单个变量 t。您可以使用三个单独的变量,也可以创建一个列表,或者......我将由您决定。

【讨论】:

  • 我编辑了这个问题。我之前通过创建三个不同的变量尝试过。它没有帮助我。
  • @Asaf,您为什么认为a.zero(...)a.even(...)a.odd(...) 会返回线程对象?您的问题中未显示这些功能的代码,因此我无法猜测您在那里的想法。但看起来您的 wrapper(...) 函数确实好像创建了一个线程,启动了该线程,然后丢弃了对新线程对象的引用。如果您没有办法join() 一个线程没有对线程对象的引用。
  • 功能:zero(...), even(...), odd(...) 与我在相关链接中附加的解决方案中的功能相同。为什么wrapper(...) 不返回线程对象?谢谢。
  • @Asaf 这些函数在您链接的页面上是空的:它们什么都不做,它们返回None。他们是skeletons,你应该用你自己的代码来填写,让他们做一些事情。
  • 我的意思是从这个解决方案:leetcode.com/problems/print-zero-even-odd/discuss/809929/…我已将其附加到我的问题中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多