Python-开始两个线程-线程(t2)名称错误

问题描述 投票:0回答:1

这个简单的示例似乎工作正常,但是当我在稍微复杂一些的代码库中实现相同的代码时,当使用NameError: name 't2' is not definedadd调用class QuoteReport时,会出现错误t2.add(key[0], key[1])。我可以在main中启动两个线程吗?尽管此代码似乎有效,但是这里有什么不是好的形式吗?我从简化示例中看到的唯一区别是,失败的是QueueReport和CallReport位于与主文件不同的文件中。但是我知道导入工作正常,因为1)如果我将代码更改为t2 = CallReport_badname(),则调用失败,无法找到该类2)我从runCallReport方法运行了一些日志记录,并且确实输出了日志。我假设一旦导入了这些类,就将其称为t2?当一个类的实例调用另一个类的实例时,我应该做些特别的事情吗?

from threading import * 
import time

class QueueReport(Thread):
  def __init__(self):
    Thread.__init__(self)
    self.reports_to_call = {}

  def add(self, user, report):
    self.reports_to_call.update({(user, report): None})
    print("Added Value - Queue Report")
    print(len(self.reports_to_call))

  def run(self):
    print("Running - que\n")
    time.sleep(10)

    while True:
        for key in self.reports_to_call:
            print(key)
            print("about to add to t2")
            t2.add(key[0], key[1])
        time.sleep(120)

class CallReport(Thread):
  def __init__(self):
    Thread.__init__(self)
    self.reports_called = {}

  def add(self, user, report):
    self.reports_called.update({(user, report): None})
    print("Added Value to reports called")
    print("len2", len(self.reports_called))


   def run(self):
    print("Running - Call\n")
    time.sleep(10)

    while True:
        for key in self.reports_called:
            print("key from running", key)
            #do something with this key and delete if succcessful
        print("Call Report done- waiting to loop")
        time.sleep(20)


if __name__ == '__main__':
  t1 = QueueReport()
  thread = Thread(target=t1.run)
  thread.start()

  t2 = CallReport()
  thread2 = Thread(target=t2.run)
  thread2.start()


t1.add("bob", "report2r")
time.sleep(1)
t1.add("tom", "report2")
time.sleep(1)
t1.add("harry", "report3")
time.sleep(15) # add new after first loop
t1.add("john", "report4")
python multithreading class
1个回答
1
投票
是的,如果将逻辑移到其他文件中,将会有所不同。 t1和t2在main方法中声明,这使它们成为全局变量,因此两个类都可以访问它们。如果它们位于不同的文件中,则必须将它们传递给它们以进行访问。

class QueueReport(Thread): def __init__(self, call_report_thread): Thread.__init__(self) self.reports_to_call = {} self.call_report_thread = call_report_thread def run(self): print("Running - que\n") time.sleep(10) while True: for key in self.reports_to_call: print(key) print("about to add to t2") self.call_report_thread.add(key[0], key[1]) time.sleep(120) if __name__ == '__main__': t2 = CallReport() thread2 = Thread(target=t2.run) thread2.start() t1 = QueueReport() thread = Thread(target=t1.run, args=(t2,)) # notice here thread.start()

我在这里假设先启动哪个线程都没有关系。
© www.soinside.com 2019 - 2024. All rights reserved.