Python启动两个线程Thread(t2)nam

2024-10-03 23:23:10 发布

您现在位置:Python中文网/ 问答频道 /正文

这个简单的例子似乎工作得很好,但是当我在一个稍微复杂一点的代码库中实现同样的代码时,当使用t2.add(key[0], key[1])class QuoteReport调用add时,我得到了一个错误NameError: name 't2' is not defined。我在main中启动两个线程的方式是否正确?虽然这段代码看起来很有效,但这里有什么不好的形式吗?从我的简化示例和失败的示例中看到的唯一区别是QueueReport和CallReport与主文件位于不同的文件中。但是我知道导入是有效的,因为1)如果我把代码改成t2 = CallReport_badname(),它就失败了;2)我从CallReportrun方法运行了一些日志记录,它会打印到日志中。我假设一旦这些类被导入,我会将其称为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")

Tags: tokeyrunselfaddtimedefsleep
1条回答
网友
1楼 · 发布于 2024-10-03 23:23:10

是的,如果将逻辑移到不同的文件中,会有差异。t1和t2在main方法中声明,该方法使它们成为全局变量,因此两个类都可以访问它们。如果它们在不同的文件中,您必须将它们传递给其他人才能访问。你知道吗

from threading import *
import time

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)

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__':
  t2 = CallReport()
  t2.start()

  t1 = QueueReport(t2)
  t1.start()

我在这里假设哪个线程先开始并不重要。你知道吗

相关问题 更多 >