[英]python NameError: global name is not defined
I am getting this error NameError: global name 'control_queue' is not defined
I have checked control_queue
through out and I think I created it right. 我收到此错误
NameError: global name 'control_queue' is not defined
我已经检查了control_queue
,我认为我创建正确了。
Here is my code: 这是我的代码:
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)
I think it is saying I am not creating it properly, but I went over a few queue tutorials and as far as I can tell it is correct. 我认为这是在说我没有正确创建它,但是我查阅了一些队列教程,据我所知它是正确的。 Can anyone point out where I am messing up?
有人可以指出我在搞砸吗? Thanks guys and gals!
谢谢伙计们!
在功能halt_listener
您的参数是control_Queue
但您使用的是变量control_queue
(大写问题)。
control_queue
is not the same thing as control_Queue
in python. control_queue
与python中的control_Queue
。 Case sensitivity matters. 区分大小写很重要。 You set the parameter to
control_Queue
but use control_queue
later on. 您将参数设置为
control_Queue
但稍后使用control_queue
。
It is wrong case. 这是错误的情况。
isAlive = control_queue.get()
should be isAlive = control_Queue.get()
. isAlive = control_queue.get()
应该是isAlive = control_Queue.get()
。
There are a few places where this is happening 在某些地方发生这种情况
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.