我写了一个python脚本用来扫描端口,使用了threadpool模块来完成多线程。
当规定扫描30个端口,
当我使用1个线程时,耗时大约40秒
当我使用10个线程时,耗时大约4秒
当我使用15个线程时,耗时还是4秒
但当我使用20个线程时耗时变为了2秒左右
使用30个线程时,耗时依旧是2秒。
为啥他的速度随线程的增多阶梯式的减少呀,而且为啥是在20左右的时候到达顶峰了。
(准确来说是线程数到19是就来到了2秒左右,而线程数18时还是4秒。)
这里是代码
#coding:utf-8
#端口扫描 利用聊天室客户端,如果端口开发,正常连接,如果没开放报错
import socket
import threadpool
import time
host=input("请输入您要扫描的地址:")
port=input("请输入您要扫描的端口:")
num=input("请输入你要用的线程数:")
try:
start=int(port.split('-')[0])
end=int(port.split('-')[1])
ports=range(start,end)
except:
ports=port.split(",")
print(ports)
def scanner(host,port):
try:
port=int(port)
s=socket.socket()
s.connect((host,port))
print(host,port,"isopen")
except:
pass
#创建50个线程
pool=threadpool.ThreadPool(int(num))
# 制作参数列表
args=[]
for port in ports:
args.append(([host,port],None))
# 规定线程池要执行的任务,第一个变量为函数名,第二个变量为参数列表
reqs=threadpool.makeRequests(scanner,args)
t1=time.time()
#将任务放到线程池里开始执行
# [pool.putRequest(req) for req in reqs]
#
for req in reqs:
pool.putRequest(req)
pool.wait()
t2=time.time()
print("结束!\n共用时",t2-t1,"秒")
下面是截图