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