我在使用python的多线程时遇到了一些问题: 生成一个线程,它获取一些参数,如线程名称,计数器等。在线程的'run'部分,它调用了一些子函数(并且还有一些子函数到某些深度)但是,自变量(类)似乎不存在于子函数中:引用self.name显示一些错误(NameError:未定义全局名称'self' )。有没有办法在没有(!!)参数化所有东西的情况下获得这些子函数中的完整结构的内容(这将在深度4处变得很长)。希望这个简短的例子能够更好地解释它,在sub1中,第二个打印行试图访问self.counter
#!/usr/bin/python
import threading
import time
globalVar = 1;
def sub1 ( name ):
global globalVar ;
print str(globalVar) + " in der 1. subfunktion von " +str(name)
print "teste self" + str(self.counter) + " - " + globalVar + " " +str(name) ;
globalVar += 1 ;
time.sleep(1);
sub2 (name) ;
return None ;
class myThread (threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print "Starting " + self.name + " mit zaehler " + str(self.counter)
sub1 (self.name);
threadLock = threading.Lock()
threads = [] ;
# Create new threads
count =0;
while count < 10 :
count += 1;
threadX = myThread(count, "Thread-" + str(count), count)
threadX.start()
threads.append(threadX)
for t in threads:
t.join()
print "Exiting Main Thread"
感谢您的帮助
答案 0 :(得分:2)
为什么你没有简单地通过self
代替name
?
#!/usr/bin/python
import threading
import time
globalVar = 1;
def sub1 ( self ):
global globalVar ;
print str(globalVar) + " in der 1. subfunktion von " +str(self.name)
print "teste self" + str(self.counter) + " - " + str(globalVar) + " " +str(self.name) ;
globalVar += 1 ;
time.sleep(1);
sub2 (self.name) ;
return None ;
class myThread (threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print "Starting " + self.name + " mit zaehler " + str(self.counter)
sub1 (self);
threadLock = threading.Lock()
threads = [] ;
# Create new threads
count =0;
while count < 10 :
count += 1;
threadX = myThread(count, "Thread-" + str(count), count)
threadX.start()
threads.append(threadX)
for t in threads:
t.join()
print "Exiting Main Thread"
由于int
无法与string
连接,我在globalVar
方法中将str(globalVar)
替换为sub1
。
如下工作:
>>> ================================ RESTART ================================
>>>
Starting Thread-1 mit zaehler 1
1 in der 1. subfunktion von Thread-1
teste self1 - 1 Thread-1
Starting Thread-2 mit zaehler 2
2 in der 1. subfunktion von Thread-2
teste self2 - 2 Thread-2Starting Thread-3 mit zaehler 3
Starting Thread-5 mit zaehler 5
Starting Thread-6 mit zaehler 6Starting Thread-7 mit zaehler 7Starting Thread-4 mit zaehler 4Starting Thread-8 mit zaehler 8Starting Thread-9 mit zaehler 9
3 in der 1. subfunktion von Thread-3
3 in der 1. subfunktion von Thread-5Starting Thread-10 mit zaehler 10
3 in der 1. subfunktion von Thread-63 in der 1. subfunktion von Thread-73 in der 1. subfunktion von Thread-9
teste self3 - 3 Thread-3
3 in der 1. subfunktion von Thread-43 in der 1. subfunktion von Thread-8
teste self5 - 3 Thread-5
teste self7 - 3 Thread-7
3 in der 1. subfunktion von Thread-10teste self6 - 3 Thread-6teste self9 - 3 Thread-9
teste self4 - 4 Thread-4
teste self8 - 5 Thread-8
teste self10 - 6 Thread-10
//+ A bunch of Sub2 is not defined errors ...
答案 1 :(得分:0)
sub1不是“子功能”。 Python有“嵌套”函数,但这不是它的一个例子。 “sub1”具有完全不同的范围,无法在您的班级下看到任何变量。
如果要访问类实例(self)变量和方法,则应将“self”作为参数传递给sub1,而不是self.name,它只是字符串“Thread - #”
reduce(thrs, dy, 1, CV_REDUCE_SUM, CV_32SC1);
然后在你的“run”方法中,用self:
调用它def sub1(thread_instance):
print thread_instance.name, thread_instance.threadID
不要使用带有线程的全局变量来存储来自线程的对象,因为当多个线程读写这个变量时,这肯定会引起麻烦。
另外,如果你的类是同一个,那么为你的类提供一个threadID和counter参数是什么意思?此外,您的代码示例不完整且缺少代码,因此很难理解您尝试使用此代码实现的目标以及您尝试执行的操作。
另一方面,你不需要在每一行之后使用分号,这不是C.我将首先专注于理解Python语言,并在使用线程之前首先获得一些基础知识。