Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ping速度比python中预期的慢_Python_Python 3.x_Windows_Multithreading_Ping - Fatal编程技术网

ping速度比python中预期的慢

ping速度比python中预期的慢,python,python-3.x,windows,multithreading,ping,Python,Python 3.x,Windows,Multithreading,Ping,我一直在尝试使用多线程ping不同的IP地址,但我觉得它不够快,它每分钟ping 3 K的IP,这是非常慢的,因为我有1700万个IP地址要ping。谁能告诉我我做错了什么 import sys from ipaddress import ip_address from subprocess import Popen, PIPE from core.thread_pool import ThreadPool class HostPing: def __init__(self):

我一直在尝试使用多线程ping不同的IP地址,但我觉得它不够快,它每分钟ping 3 K的IP,这是非常慢的,因为我有1700万个IP地址要ping。谁能告诉我我做错了什么

import sys
from ipaddress import ip_address
from subprocess import Popen, PIPE
from core.thread_pool import ThreadPool

class HostPing:
    def __init__(self):
        self.ok = 0
        self.bad = 0
        self.noresp = 0
        self.response_codes = []
        self.output_codes = []

    def create_ips(self, start, end):
        start_int = int(ip_address(start).packed.hex(), 16)
        end_int = int(ip_address(end).packed.hex(), 16)
        return [ip_address(ip).exploded for ip in range(start_int, end_int)]

    def ping(self, address, **kwargs):
        command = ['ping', '-c', '1', '-n', '1', '-w', '2',  address]
        p = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE)
        output, err = p.communicate(b"input data that is passed to subprocess' stdin")
        res = p.returncode
        output = output.decode().strip()
        if res == 0:
            self.ok += 1
        elif res == 2:
            self.noresp += 1
        else:
            self.bad += 1

        sys.stdout.write("\r OK: {}, Bad: {}, NoResponse: {}".format(self.ok, self.bad, self.noresp))


if __name__ == '__main__':
    api = HostPing()
    ips = api.create_ips("25.0.0.0", "25.255.255.255")
    pool = ThreadPool(30)
    pool.map(api.ping, ips)
    pool.wait_completion()
这不适合你的任务

你会更乐意使用它。 它速度快,并且乐于接受多个目标/范围

值得注意的是,ICMP是一种主机对主机协议, 内核没有要解复用的端口号 允许进程到进程的数据包调度。 因此,如果您有几十个
ping
子进程, 他们都在每个响应数据包上醒来, 执行相等性测试,通常拒绝 传入的数据包为“不适合我”。 因此fping,能够识别不同的目标,
效率要高得多。

这是一个I/O绑定任务,因为您正在等待从主机发送和接收数据包,考虑到最适合I/O绑定任务,可能最好采用异步方法,无论您有1700万台主机进行ping,仍然需要一些时间。似乎可以加快异步。据我所知,Win操作系统不支持Tnx for input.fping。但你确实给了我一些合作的想法。
command = ['ping', '-c', '1', '-n', '1', '-w', '2',  address]