将Python线程追加到列表
我试图在Python中将线程附加到列表中,以便稍后使用join方法对其进行迭代。但是,当我将Thread对象附加到列表时,它会在列表中创建两个条目。一个用于线程,另一个用于函数对象。 相关代码如下:将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
#!/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是一个内置函数!代码现在工作得很好。非常感谢!