Python Thread在for循环中传递线程对象的问题

时间:2014-06-24 05:16:30

标签: python multithreading

为什么这段代码没有提供来自"服务器的所有列表变量"清单?我认为它应该打印所有这些主机,而不是只打印列表中的最后一个变量。

#!/usr/bin/python
import time
import threading
from threading import Thread
import os,sys
class InitThread(Thread):
    def  __init__(self,threadID, host):
        self.host = host
        self.threadID = threadID
        super(InitThread, self).__init__()

    def run(self):
        print host




servers=[ 'yahoo.com','google.com','10.0.0.10','10.0.0.0.11','10.0.0.12']

jobs = []
threadID = 1
for host in servers:
    t=InitThread(threadID,host)
    jobs.append(t)
    threadID += 1
for t in jobs:
    t.start()
    t.join()    

执行上述脚本后,我将得到如下输出,

# python foo.py 
10.0.0.12
10.0.0.12
10.0.0.12
10.0.0.12
10.0.0.12

1 个答案:

答案 0 :(得分:2)

您正在host方法中打印类变量run,而不是实例变量host。由于该变量在InitThread的所有实例之间共享,并且最后一次赋值使其成为列表的最后一个元素,因此您将始终获得列表的最后一个元素。

您可以通过预先self来修复它。

#!/usr/bin/python
import time
import threading
from threading import Thread
import os,sys
class InitThread(Thread):
    def  __init__(self,threadID, host):
        super(InitThread, self).__init__()
        self.host = host
        self.threadID = threadID

    def run(self):
        print self.host