这个简单的例子似乎工作得很好,但是当我在一个稍微复杂一点的代码库中实现同样的代码时,当使用t2.add(key[0], key[1])
从class QuoteReport
调用add
时,我得到了一个错误NameError: name 't2' is not defined
。我在main
中启动两个线程的方式是否正确?虽然这段代码看起来很有效,但这里有什么不好的形式吗?从我的简化示例和失败的示例中看到的唯一区别是QueueReport和CallReport与主文件位于不同的文件中。但是我知道导入是有效的,因为1)如果我把代码改成t2 = CallReport_badname()
,它就失败了;2)我从CallReport
的run
方法运行了一些日志记录,它会打印到日志中。我假设一旦这些类被导入,我会将其称为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")
是的,如果将逻辑移到不同的文件中,会有差异。t1和t2在
main
方法中声明,该方法使它们成为全局变量,因此两个类都可以访问它们。如果它们在不同的文件中,您必须将它们传递给其他人才能访问。你知道吗我在这里假设哪个线程先开始并不重要。你知道吗
相关问题 更多 >
编程相关推荐