0。0; 2023-11-09 17:44 采纳率: 100%
浏览 8
已结题

python 多线程 耗时问题

我写了一个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,"秒")

下面是截图

img

img

img

img

img

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-09 23:49
    关注

    【以下回答由 GPT 生成】

    问题的原因是Python的全局解释锁(GIL)。GIL是Python解释器的特性,它确保同一时刻只有一个线程在执行Python字节码,这意味着Python的多线程并不能充分利用多核处理器的性能。

    虽然你在代码中使用了多线程,但是由于GIL的存在,实际上只有一个线程在执行Python字节码,而其他线程处于等待状态。线程池模块threadpool是基于Python线程实现的,所以它无法绕过GIL的限制。

    当你增加线程的数量时,每个线程都会竞争GIL,但由于每个线程只能占据一小部分的执行时间,所以随着线程数量的增加,性能并没有线性增长。当线程数量逐渐增加时,达到一定数量后,线程之间的竞争开始导致性能下降的急剧降低。而当达到一定数量后,线程之间的争夺几乎不会再导致性能下降。

    要优化这个问题,可以考虑以下几个方案: 1. 使用多进程:由于每个进程有自己独立的Python解释器,所以每个进程都可以利用多核处理器的性能。可以使用multiprocessing模块来实现多进程的端口扫描。 2. 使用异步IO:Python中有很多异步IO库,如asyncio、gevent等。这些库可以绕过GIL的限制,实现高效的异步IO操作。你可以使用这些库来实现端口扫描。 3. 使用其他编程语言:如果你对Python的多线程性能要求较高,可以考虑使用其他没有GIL限制的编程语言,如Java、C++等来实现端口扫描。

    综上所述,由于GIL的存在,使用Python的多线程进行端口扫描时,性能会受到限制。要优化这一问题,可以采用多进程、异步IO或者使用其他编程语言来实现。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月19日
  • 已采纳回答 11月11日
  • 创建了问题 11月9日

悬赏问题

  • ¥20 python爬虫遇到空文本取不出来
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入