将Python线程追加到列表

将Python线程追加到列表,python,multithreading,join,Python,Multithreading,Join,我试图在Python中将线程附加到列表中,以便稍后使用join方法对其进行迭代。但是,当我将Thread对象附加到列表时,它会在列表中创建两个条目。一个用于线程,另一个用于函数对象。 相关代码如下: #!/usr/bin/python import socket import errno import sys import operator import threading import time def removeDuplicates(oldList): newList = li

我试图在Python中将线程附加到列表中,以便稍后使用join方法对其进行迭代。但是,当我将Thread对象附加到列表时,它会在列表中创建两个条目。一个用于线程,另一个用于函数对象。 相关代码如下:

#!/usr/bin/python

import socket
import errno
import sys
import operator
import threading
import time

def removeDuplicates(oldList):
    newList = list();

    for i in oldList:
        if i not in newList:
            newList.append(i)

    return newList;

def expandRange(portRange):
   if "-" not in portRange:
       l = list()
       l.append(int(portRange))
       return l

   portLimits=portRange.split("-")
   return range(int(portLimits[0]),int(portLimits[1])+1)

def parsePorts(portList):
    if "," in portList:
        ports = portList.split(",")
        portRanges = [expandRange(i) for i in ports]
        portRanges = reduce(operator.add, portRanges)
        ports = removeDuplicates(portRanges)
        return ports
        else:
            l = list()
            l.append(int(portList))
#            print "I AM HERE" ,l
            return l


def check_port(host, port):
    try:
        activeThreads.append(id);
        s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        s.connect((host,port))

        mutex.acquire()
        print "%s:%s ---> Port open!" %  (host,port)
        mutex.release()

    except socket.error as e:
        if e.errno == errno.ECONNREFUSED:
            mutex.acquire()
            print "%s:%s ---> Port closed" %  (host,port)
            mutex.release()
            s.close()
        elif e.errno == errno.ETIMEDOUT:
            mutex.acquire()
            print "%s:%s ---> Connection timed out" %  (host,port)
            mutex.release()
            s.close()
        elif e.errno == errno.ENOEXEC:
            mutex.acquire()
            print "%s:%s ---> Host down" %  (host,port)
            mutex.release()
            s.close()
        else:
            raise



if len(sys.argv) < 3:
    print "Usage is:\n %s <host> <port>" % sys.argv[0]
    exit(1)


host = sys.argv[1]
portList = sys.argv[2]
ports = parsePorts(portList);
activeThreads = list()
#print activeThreads
mutex = threading.Lock()
print "Thread objects: "


for port in ports:
   try:
       newThread = threading.Thread(target=check_port,args=(host,port))
       print type(newThread)
       activeThreads.append(newThread)
       newThread.start()
#       print " THREADS: %s" % activeThreads
   except:
      raise
      #print "Error: unable to start thread"



print "\nActiveThreads list:"
#print activeThreads
counter = 0;
for t in activeThreads: 
#    print "[%d] => %s" % (counter,type(t))
    print counter, t, type(t)
    counter+=1;

time.sleep(5)
#/usr/bin/python
导入套接字
输入错误号
导入系统
进口经营者
导入线程
导入时间
def移除副本(旧列表):
newList=list();
对于旧列表中的i:
如果我不在新列表中:
newList.append(一)
返回newList;
def expandRange(端口范围):
如果“-”不在端口范围内:
l=列表()
l、 附加(int(portRange))
返回l
portLimits=portRange.split(“-”)
返回范围(int(端口限制[0]),int(端口限制[1])+1)
def解析端口(端口列表):
如果端口列表中有“,”
端口=端口列表。拆分(“,”)
portRanges=[expandRange(i)用于端口中的i]
portRanges=reduce(operator.add,portRanges)
端口=移除的副本(端口范围)
返回端口
其他:
l=列表()
l、 附加(int(端口列表))
#打印“我在这里”,l
返回l
def检查_端口(主机、端口):
尝试:
activeThreads.append(id);
s=socket.socket(socket.AF\u INET,socket.SOCK\u STREAM)
s、 连接((主机、端口))
mutex.acquire()
打印“%s:%s--->端口打开!”%(主机,端口)
mutex.release()
除socket.error外,错误为e:
如果e.errno==errno.econnreference:
mutex.acquire()
打印“%s:%s-->端口已关闭”%(主机,端口)
mutex.release()
s、 关闭()
elif e.errno==errno.ETIMEDOUT:
mutex.acquire()
打印“%s:%s-->连接超时”%(主机、端口)
mutex.release()
s、 关闭()
elif e.errno==errno.ENOEXEC:
mutex.acquire()
打印“%s:%s-->主机关闭”%(主机,端口)
mutex.release()
s、 关闭()
其他:
提升
如果len(sys.argv)<3:
打印“用法是:\n%s”%sys.argv[0]
出口(1)
主机=sys.argv[1]
portList=sys.argv[2]
端口=解析端口(端口列表);
activeThreads=list()
#打印活动线程
mutex=threading.Lock()
打印“线程对象:”
对于端口中的端口:
尝试:
newThread=threading.Thread(目标=检查端口,参数=(主机,端口))
打印类型(新线程)
附加(newThread)
newThread.start()
#打印“线程:%s”%activeThreads
除:
提升
#打印“错误:无法启动线程”
打印“\n活动读取列表:”
#打印活动线程
计数器=0;
对于activeThreads中的t:
#打印“[%d]=>%s”%(计数器,类型(t))
打印计数器,t,类型(t)
计数器+=1;
时间。睡眠(5)
结果输出如下所示:

Thread objects:
<class 'threading.Thread'>
<class 'threading.Thread'>
<class 'threading.Thread'>
<class 'threading.Thread'>
<class 'threading.Thread'>
<class 'threading.Thread'>
<class 'threading.Thread'>
<class 'threading.Thread'>
<class 'threading.Thread'>
<class 'threading.Thread'>
<class 'threading.Thread'>
<class 'threading.Thread'>

ActiveThreads list:
0 <Thread(Thread-1, started -2146345816)> <class 'threading.Thread'>
1 <built-in function id> <type 'builtin_function_or_method'>
2 <Thread(Thread-2, started -2146342704)> <class 'threading.Thread'>
3 <built-in function id> <type 'builtin_function_or_method'>
4 <Thread(Thread-3, started -2146339968)> <class 'threading.Thread'>
5 <built-in function id> <type 'builtin_function_or_method'>
6 <Thread(Thread-4, started -2146337288)> <class 'threading.Thread'>
7 <built-in function id> <type 'builtin_function_or_method'>
8 <Thread(Thread-5, started -2146334528)> <class 'threading.Thread'>
9 <built-in function id> <type 'builtin_function_or_method'>
10 <Thread(Thread-6, started -2146330960)> <class 'threading.Thread'>
11 <built-in function id> <type 'builtin_function_or_method'>
12 <Thread(Thread-7, started -2146328288)> <class 'threading.Thread'>
13 <built-in function id> <type 'builtin_function_or_method'>
14 <Thread(Thread-8, started -2146325480)> <class 'threading.Thread'>
15 <built-in function id> <type 'builtin_function_or_method'>
16 <Thread(Thread-9, started -2146322832)> <class 'threading.Thread'>
17 <built-in function id> <type 'builtin_function_or_method'>
18 <Thread(Thread-10, started -2146320160)> <class 'threading.Thread'>
19 <built-in function id> <type 'builtin_function_or_method'>
20 <Thread(Thread-11, started -2146317512)> <class 'threading.Thread'>
21 <built-in function id> <type 'builtin_function_or_method'>
22 <Thread(Thread-12, started -2146314760)> <class 'threading.Thread'>
23 <built-in function id> <type 'builtin_function_or_method'>
localhost:25 ---> Port closed
localhost:113 ---> Port closed
localhost:32 ---> Port closed
localhost:110 ---> Port closed
localhost:81 ---> Port closed
localhost:112 ---> Port closed
localhost:33 ---> Port closed
localhost:82 ---> Port closed
localhost:80 ---> Port closed
localhost:34 ---> Port closed
localhost:111 ---> Port closed
localhost:90 ---> Port closed
线程对象:
活动线程列表:
0
1.
2.
3.
4.
5.
6.
7.
8.
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
本地主机:25--->端口已关闭
本地主机:113-->端口已关闭
本地主机:32--->端口已关闭
本地主机:110--->端口已关闭
本地主机:81--->端口已关闭
本地主机:112--->端口已关闭
本地主机:33--->端口已关闭
本地主机:82-->端口已关闭
本地主机:80--->端口已关闭
本地主机:34--->端口已关闭
本地主机:111--->端口已关闭
本地主机:90--->端口已关闭
与线程对象一起附加到列表中的这些生成的内置函数或方法是什么?我如何得到一个线程列表来迭代并调用.join()


谢谢

代码看起来不错。感谢您添加缺少的方法

您应该删除
activeThreads.append(id)check\u port
方法中使用code>,因为
id
是python的缩写,缺少的括号给出了
内置函数或\u方法
类型错误

之后,所有线程的连接都很容易:

for t in activeThreads: 
    t.join()

你能在循环中打印计数器t,键入(t)
吗?顺便说一下,不要使用手动计数器,请使用
枚举
。代码看起来不错,请显示
解析端口
检查端口
方法。谢谢!我没意识到id是一个内置函数!代码现在工作得很好。非常感谢!