尝试定义线程时对象没有属性

时间:2019-01-23 11:51:23

标签: python multithreading

这是代码:

class foo:
    def levelOne(self):
        def worker(self, i):
            print('doing hard work')
        def writer(self):
            print('writing workers work')

session = foo()

i=0
threads = list()
for i in range(0,5):
    thread = threading.Thread(target=session.levelOne.worker, args=(i,))
    thread.start()
    threads.append(thread)

writerThread = threading.Thread(target=session.levelOne.writer)
writerThread.start()

for thread in threads:
    thread.join()

writerThread.join()

应由5名工人来做,作者应收集结果。

我得到的错误是:会话对象没有属性工作者

工人实际上是测试人员,他们在不同的“区域”中执行特定的工作,而作者一直在跟踪他们,而不会使我的工人返回任何结果。 将算法划分为“ levelOne”,“ levelTwo”等层很重要,因为它们将一起工作。这就是为什么我将线程保留在类之外而不是levelOne方法的主要原因。

请帮助我了解我哪里错了

1 个答案:

答案 0 :(得分:2)

您肯定不要将“会话对象没有属性工作者”作为错误消息,并带有您发布的代码-错误应该是“'函数'对象没有属性'工作者'”。实际上,我不知道为什么会有其他期望-函数中定义的名称是局部变量(提示:python函数是与其他函数一样的对象),它们不会成为函数的属性。

  

将此算法划分为“ levelOne”,“ levelTwo”之类的层很重要

可能,但这不是正确的设计。如果您希望foo只是一个名称空间,而levelOnelevelTwo等则是具有bot writerworker方法的某种类型的实例,那么您需要1 /将LevelXXX定义为类,2 /将这些对象的实例构建为foo类的属性,即:

class LevelOne():
    def worker(self, i):
       # ...
    def writer(self):
       # ...


class foo():
    levelOne = LevelOne()

现在无论如何都不保证这是您用例的正确设计,但是如果不了解问题,就不可能设计出合适的解决方案...

  

如果可能的话,您能解释一下为什么尝试访问问题代码中所示的工作者和作者是错误的设计吗?

好吧,仅出于xD的考虑,仅出于其无法正常工作的原因。

请注意,您可以levelOne方法返回“ worker”和“ writer”函数,即:

class foo:
    def levelOne(self):
        def worker(self, i):
            print('doing hard work')
        def writer(self):
            print('writing workers work')

        return worker, writer


session = foo()
worker, writer = session.levelOne()

# etc

但是这都是令人费解的(假设重点是让workerwriter共享self,这更简单地使用适当的LevelOne类并workerwriter这个类的方法)和效率低下的情况(def是一个可执行语句,因此使用您的解决方案可以重新创建workerwriter函数-这不是免费的-每次通话都可以。)