Skip to main content
 首页 » 编程设计

python 名称错误: global name is not defined

2025年05月04日16think

我收到此错误 NameError: global name 'control_queue' is not defined 我已经彻底检查了 control_queue,我认为我创建它是正确的。

这是我的代码:

import multiprocessing  
import time  
from threading import Thread 
 
class test_imports:#Test classes remove  
      alive = {'import_1': True, 'import_2': True}; 
 
      def halt_listener(self, control_Queue, thread_Name, kill_command): 
          while True: 
              print ("Checking queue for kill") 
              isAlive = control_queue.get() 
              print ("isAlive", isAlive) 
              if isAlive == kill_command: 
                 print ("kill listener triggered") 
                 self.alive[thread_Name] = False; 
                 return 
 
      def import_1(self, control_Queue, thread_Number): 
          print ("Import_1 number %d started") % thread_Number 
          halt = test_imports() 
          t = Thread(target=halt.halt_listener, args=(control_Queue, 'import_1', 't1kill')) 
          count = 0  
          t.run() 
          global alive  
          run = test_imports.alive['import_1']; 
          while run: 
                print ("Thread type 1 number %d run count %d") % (thread_Number, count) 
                count = count + 1 
                print ("Test Import_1 ", run) 
                run = self.alive['import_1']; 
          print ("Killing thread type 1 number %d") % thread_Number  
 
 
 
      def import_2(self, control_queue, thread_number): 
          print ("Import_2 number %d started") % thread_number 
          count = 1 
          while True: 
                alive = control_queue.get()                    
                count = count + 1 
                if alive == 't2kill': 
                   print ("Killing thread type 2 number %d") % thread_number 
                   return  
                else: 
                     print ("Thread type 2 number %d run count %d") % (thread_number, count) 
 
 
class worker_manager: 
     def __init__(self): 
        self.children = {} 
 
     def generate(self, control_queue, threadName, runNum): 
        i = test_imports() 
        if threadName == 'one': 
            print ("Starting import_1 number %d") % runNum 
            p = multiprocessing.Process(target=i.import_1, args=(control_queue, runNum)) 
            self.children[threadName] = p 
            p.start()         
        elif threadName == 'two':  
            print ("Starting import_2 number %d") % runNum 
            p = multiprocessing.Process(target=i.import_2, args=(control_queue, runNum)) 
            self.children[threadName] = p 
            p.start() 
        elif threadName == 'three':     
            p = multiprocessing.Process(target=i.import_1, args=(control_queue, runNum)) 
            print ("Starting import_1 number %d") % runNum 
            p2 = multiprocessing.Process(target=i.import_2, args=(control_queue, runNum)) 
            print ("Starting import_2 number %d") % runNum 
            self.children[threadName] = p 
            self.children[threadName] = p2 
            p.start() 
            p2.start() 
 
        else: 
            print ("Not a valid choice choose one two or three")      
 
     def terminate(self, threadName): 
         self.children[threadName].join 
 
 
if __name__ == '__main__': 
    # Establish communication queues 
    control = multiprocessing.Queue() 
    manager = worker_manager() 
 
    runNum = int(raw_input("Enter a number: "))  
    threadNum = int(raw_input("Enter number of threads: ")) 
    threadName = raw_input("Enter number: ") 
    thread_Count = 0 
 
    print ("Starting threads")  
 
    for i in range(threadNum): 
        manager.generate(control, threadName, i) 
        thread_Count = thread_Count + 1               
 
    time.sleep(runNum)#let threads do their thing 
 
    print ("Terminating threads")      
 
    for i in range(thread_Count): 
        control.put("t1kill") 
        control.put("t2kill") 
 
    manager.terminate(threadName)  

我认为这是在说我没有正确创建它,但我浏览了一些队列教程,据我所知它是正确的。谁能指出我在哪里搞砸了?谢谢伙计们!

请您参考如下方法:

在函数 halt_listener 中,您的参数是 control_Queue 但您使用的是变量 control_queue(大小写问题)。