Python-使用套接字进行多线程处理会产生随机结果

Python-使用套接字进行多线程处理会产生随机结果,python,multithreading,sockets,connection,multiprocessing,Python,Multithreading,Sockets,Connection,Multiprocessing,我现在真的很困惑我的问题。我想在主机(或子网)列表上发现一个打开的端口 首先让我们展示一下我到目前为止所做的 from multiprocessing.dummy import Pool as ThreadPool from netaddr import IPNetwork as getAddrList import socket, sys this = sys.modules[__name__] def threading(ip): sock = socket.socket(so

我现在真的很困惑我的问题。我想在主机(或子网)列表上发现一个打开的端口

首先让我们展示一下我到目前为止所做的

from multiprocessing.dummy import Pool as ThreadPool 
from netaddr import IPNetwork as getAddrList
import socket, sys

this = sys.modules[__name__]

def threading(ip):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.settimeout(this.timeout)

    failCode = 0

    try:
        if sock.connect_ex((str(ip), this.port)) == 0:
            #port open
            this.count += 1
        else:
            #port closed/filtered
            failCode = 1
            pass
    except Exception: 
        #host unreachable
        failCode = 2
        pass
    finally:
        sock.close()

#set thread num
threads = 64
#set socket timeout
this.timeout = 1
#set ip list
ipList = getAddrList('8.8.8.0/24')
#set port
this.port = 53
#set count
this.count = 0

#threading
Pool = ThreadPool(threads) 
Pool.map_async(threading, ipList).get(9999999)
Pool.close()
Pool.join()

#result
print str(this.count)
脚本工作正常,没有任何错误。但我正在为它打印出来的内容而挣扎

因此,如果我想扫描子网
8.8.8.0/24
并发现端口
53
。我知道唯一拥有开放dns端口的服务器是
8.8.8.8
(谷歌dns)

但是当我多次运行脚本时,
print str(this.count)
将随机(在我看来是…)返回
0
1

我还知道:

  • 仅扫描
    8.8.8.8
    始终打印
    1
  • 仅使用一个线程打印
    /24
    始终
    1
  • 使用256个线程进行
    /24
    随机打印
    0
    1
  • 更改超时没有帮助

因此,它似乎与线程选项有关,该选项会导致我的计算机出现延迟。但是请注意,我的CPU使用率是第一个错误是:


但是请注意,我的CPU使用率是第一个错误是:

但请注意,我的CPU使用率是