返回顶部
首页 > 资讯 > 后端开发 > Python >Python 协程检测Kubernetes服务端口
  • 408
分享到

Python 协程检测Kubernetes服务端口

端口PythonKubernetes 2023-01-31 08:01:54 408人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

一、需求分析在上一篇文章,链接如下:https://www.cnblogs.com/xiao987334176/p/10237551.html 已经得到了需要的数据,现在需要对这些端口做检测,判断端口是否正常!实际情况是,有上百个

一、需求分析

在上一篇文章,链接如下:

https://www.cnblogs.com/xiao987334176/p/10237551.html

 

已经得到了需要的数据,现在需要对这些端口做检测,判断端口是否正常!

实际情况是,有上百个端口需要检测。如果一个个检测,可能需要花费几分钟的时间,效率不够快!

那么首先想到的就是多进程,但是一个进程会消耗一个CPU。

在不影响性能的情况下,最快的办法,就是使用协程。它是异步的,遇到io会自动切换!

 

介绍

 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加的访问全局变量,所以上下文的切换非常快。

 

关于 进程、线程和协程的理解,请参考链接:

Https://www.cnblogs.com/guolei2570/p/8810536.html

 

这篇文章,有大量的图片解释,通俗易懂!

 

安装

使用协程,需要安装模块

pip3 install gevent

什么是猴子补丁(monkey patch)

monkey patch指的是在执行时动态替换,通常是在startup的时候.
用过gevent就会知道,会在最开头的地方gevent.monkey.patch_all();把标准库中的thread/Socket等给替换掉.这样我们在后面使用socket的时候能够跟寻常一样使用,无需改动不论什么代码,可是它变成非堵塞的了.

 

使用

导入模块时,必须要导入猴子补丁

from gevent import monkey; monkey.patch_all()
import gevent

示例

from gevent import monkey;monkey.patch_all()
# 它会把下面导入的所有的模块中的IO操作都打成一个包,gevent就能够认识这些IO了
import time
import gevent


def eat():
    print('eating1')
    time.sleep(1)  # 延时调用
    print(time.time(),'eating2')


def play():
    print('playing1')
    time.sleep(1)  # 延时调用
    print(time.time(),'playing2')


g1 = gevent.spawn(eat)  # 创建一个协程对象g1
g2 = gevent.spawn(play)
g1.join()  # 等待g1结束
g2.join()

 

执行输出:

eating1
playing1
1546917759.6040378 eating2
1546917759.6040378 playing2

看时间戳,可以发现,即使睡眠了1秒,2个函数几乎是同时运行的

 

#!/usr/bin/env pythoncoding: utf-8
import os
import JSON
import time
import socket
from gevent import monkey;monkey.patch_all()
import gevent

# data = ""
# with open('test.json') as f:
#     data = json.loads(f.read())

# api整理好的json数据
data = {"voucher-center-master": [
    {"server_port": 8012, "ip": "192.169.167.105", "pod_name": "voucher-center-rc-p20kk", "nodeName": "job-node149",
     "beejob_port": 3011},
    {"server_port": 8012, "ip": "192.169.183.26", "pod_name": "voucher-center-rc-vknkt", "nodeName": "job-node137",
     "beejob_port": 3011},
    {"server_port": 8012, "ip": "192.169.242.29", "pod_name": "voucher-center-rc-0x482", "nodeName": "job-node145",
     "beejob_port": 3011},
    {"server_port": 8012, "ip": "192.169.76.159", "pod_name": "voucher-center-rc-xtxfb", "nodeName": "job-node151",
     "beejob_port": 3011},
    {"server_port": 8012, "ip": "192.169.98.159", "pod_name": "voucher-center-rc-n9wkl", "nodeName": "job-node147",
     "beejob_port": 3011}]}


class CheckServer(object):  # 检查服务端口
    def __init__(self):
        self.process_list = []  # 进程列表

    def check_tcp(self, ip, port, timeout=1):
        """
        检测tcp端口
        :param ip: ip地址
        :param port: 端口号
        :param timeout: 超时时间
        :return: bool
        """
        flag = False
        try:
            socket.setdefaulttimeout(timeout)  # 整个socket层设置超时时间
            cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            address = (str(ip), int(port))
            status = cs.connect_ex((address))  # 开始连接
            cs.settimeout(timeout)

            if not status:
                flag = True

            return flag
        except Exception as e:
            print("error:%s" % e)
            return flag

    def write_log(self, content):
        """
        写入日志文件
        :param content: 写入内容
        :return:
        """
        path = "output.log"  # 日志文件
        with open(path, mode='a+', encoding='utf-8') as f:
            content = time.strftime('%Y-%m-%d %H:%M:%S') + ' ' + content + "\n"
            print(content)
            f.write(content)

    def run(self, name, ip, port, cateGory):
        """
        运行程序
        :param name: 名称
        :param ip: ip
        :param port: 端口
        :param category: 类别
        :return:
        """
        self.write_log("name:{} {}_ip:{} 检查端口: {} 状态:{}".fORMat(name, category, ip, port, self.check_tcp(ip, port)))

    def main(self):
        for i in data:  # 遍历字典
            # print("name",i)
            for j in data[i]:  # 遍历节点数据
                if j.get('server_port'):  # 获取server_port
                    if j.get('ip'):
                        ip = j['ip']
                        port = j['server_port']
                        # 添加到进程列表中
                        self.process_list.append(gevent.spawn(self.run, i, ip, port, 'server'))

                if j.get('beejob_port'):  # 获取beejob_port
                    if j.get('ip'):
                        ip = j['ip']
                        port = j['beejob_port']
                        # 添加到进程列表中
                        self.process_list.append(gevent.spawn(self.run, i, ip, port, 'beejob'))

        return self.process_list


if __name__ == '__main__':
    startime = time.time()  # 开始时间
    process_list = CheckServer().main()
    gevent.joinall(process_list)  # 使用协程执行所有协程

    endtime = time.time()
    take_time = endtime - startime

    if take_time < 1:  # 判断不足1秒时
        take_time = 1  # 设置为1秒
    # 计算花费时间
    m, s = divmod(take_time, 60)
    h, m = divmod(m, 60)

    print("本次花费时间 %02d:%02d:%02d" % (h, m, s))

 

执行输出:

2019-01-08 11:27:54 name:voucher-center-master server_ip:192.169.167.105 检查端口: 8012 状态:False

2019-01-08 11:27:54 name:voucher-center-master beejob_ip:192.169.167.105 检查端口: 3011 状态:False

2019-01-08 11:27:54 name:voucher-center-master server_ip:192.169.183.26 检查端口: 8012 状态:False

2019-01-08 11:27:54 name:voucher-center-master beejob_ip:192.169.183.26 检查端口: 3011 状态:False

2019-01-08 11:27:54 name:voucher-center-master server_ip:192.169.242.29 检查端口: 8012 状态:False

2019-01-08 11:27:54 name:voucher-center-master beejob_ip:192.169.242.29 检查端口: 3011 状态:False

2019-01-08 11:27:54 name:voucher-center-master server_ip:192.169.76.159 检查端口: 8012 状态:False

2019-01-08 11:27:54 name:voucher-center-master beejob_ip:192.169.76.159 检查端口: 3011 状态:False

2019-01-08 11:27:54 name:voucher-center-master server_ip:192.169.98.159 检查端口: 8012 状态:False

2019-01-08 11:27:54 name:voucher-center-master beejob_ip:192.169.98.159 检查端口: 3011 状态:False

本次花费时间 00:00:01

 

可以发现,即使有那么多端口,1秒钟就完成了,使用协程非常的高效!


--结束END--

本文标题: Python 协程检测Kubernetes服务端口

本文链接: https://lsjlt.com/news/193546.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python 协程检测Kubernetes服务端口
    一、需求分析在上一篇文章,链接如下:https://www.cnblogs.com/xiao987334176/p/10237551.html 已经得到了需要的数据,现在需要对这些端口做检测,判断端口是否正常!实际情况是,有上百个...
    99+
    2023-01-31
    端口 Python Kubernetes
  • python-检测ssh端口
    #!/usr/bin/env python#-*- coding:utf-8 -*-import socket,sysfrom optparse import OptionParserstat_ok=0stat_warning=1stat_...
    99+
    2023-01-31
    端口 python ssh
  • Python实现端口检测
    一、背景: 在平时工作中有遇到端口检测,查看服务端特定端口是否对外开放,常用nmap,tcping,telnet等,同时也可以利用站长工具等web扫描端口等。但是在使用站长工具发现: 每次只能输入一个检测的地址; 虽然可以输入多个端口,但...
    99+
    2023-01-31
    端口 Python
  • python检测主机存活端口
    监测主机存活的端口#!/usr/bin/env python # coding-utf8 import argparse import socket import sys #author: wolf_ribble def scan_po...
    99+
    2023-01-31
    端口 主机 python
  • python3写的一个检测远程服务器端口
    分两部分:1 python脚本2 一个config.txt文件有机会在共享一下编译成exe的文件。 1、脚本#!/usr/bin/env pythonimport osimport sysimport socketimport msvcrt...
    99+
    2023-01-31
    端口 服务器
  • python 实现端口连通性检测
    # -*- coding: utf-8 -*- #!/bin/env python #AUTHOR:karl #DATE:2018-1-19 #VERSION:V1.0 ###################### import time ...
    99+
    2023-01-31
    端口 连通性 python
  • python检测端口是否被侦听
    Python检查端口是否被监听 关于socket.connect_ex和socket.connect, 前者是返回状态值而不是抛出异常. 适合这种判断可连接的情景. Like connect(address), but ret...
    99+
    2023-01-31
    端口 python
  • 阿里云服务器端口检测命令详解
    本文主要介绍阿里云服务器端口检测命令的使用方法,帮助用户更好地管理和维护服务器。 阿里云服务器端口检测命令是阿里云推出的一款用于检测服务器端口开放情况的工具,它可以帮助用户快速、准确地检查服务器的端口是否开放,从而确保服务器的稳定运行。使用...
    99+
    2023-12-11
    阿里 端口 详解
  • linux如何检测远程端口是否打开
    这篇文章主要介绍linux如何检测远程端口是否打开,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 检测远程端口是否打开常用telnet 110.101.101.101 80方式测试远程主机端口是否打开。&n...
    99+
    2023-06-09
  • 阿里云服务器端口检测命令在哪里?
    在使用阿里云服务器时,有时候需要进行端口检测来确保服务器的安全性和稳定性。本文将介绍如何使用命令行工具来检测阿里云服务器的端口是否正常工作。 1. 使用telnet命令telnet是一种常用的网络诊断工具,可以通过telnet命令来检测服务...
    99+
    2024-01-14
    阿里 端口 命令
  • 如何建立云服务器端口协议服务端口
    建立云服务器端口协议服务端口是一项非常复杂的任务,需要考虑许多因素。以下是一些有用的建议,可以帮助你建立云服务器端口协议服务端口: 确保你的云服务器有可用的服务器端口:你需要确保你的云服务器有足够的可用端口来提供端口服务。一般来说,你需...
    99+
    2023-10-26
    端口 协议 服务器
  • 使用python检测主机存活端口及检查存活主机
    监测主机存活的端口 #!/usr/bin/env python # coding-utf import argparse import socket import sys #author: wolf_r...
    99+
    2022-06-04
    主机 端口 python
  • 关于linux检测服务端口连通性四种方法
    目录 1、telnet方法2、nc方法3、wget方法4、>方法 1、telnet方法 telnet是linux最常用的测试端口工具,默认一般都自带。用法为 telnet ip prot,如下表示端口连接成功 2、nc方法 n...
    99+
    2023-08-30
    linux 服务器 运维
  • linux 检测远程端口是否打开方法总结
    检测远程端口是否打开 常用telnet 110.101.101.101 80方式测试远程主机端口是否打开。 除此之外还可以使用: 方法1.nmap ip -p port 测试端口 nmap i...
    99+
    2022-06-04
    端口 方法 linux
  • linux怎么检测远程主机端口是否开启
    在Linux系统中,可以使用以下方法来检测远程主机端口是否开启: 使用telnet命令:telnet是一个常用的网络工具,可以用来...
    99+
    2024-03-12
    linux
  • 如何建立云服务器端口协议服务端口命令
    建立云服务器端口协议服务端口的命令有很多,以下是一些常用的命令: CMD /etc/server/statistics:列出您需要使用端口的实例名称。 Shell脚本:使用命令行工具创建一个Shell脚本,可以检查服务器的端口状态,并在...
    99+
    2023-10-27
    端口 命令 协议
  • 如何建立云服务器端口协议服务端口连接
    建立云服务器端口协议服务端口连接需要考虑以下几个步骤: 确定服务器的位置和端口:在选择服务器后,需要确定服务器的位置和端口信息,这些信息可以帮助我们更好地确定服务端口的连接端口。 下载服务端软件并安装:将云服务器端软件下载到本地机器并安...
    99+
    2023-10-27
    端口 协议 服务器
  • python批量telnet检测IP地址的端口是否开放
    目录需求代码示例需求 需要检查多个端口是否开放,没有找到第三方工具和服务来快速测通,就自己用python写了个脚本.原理是通过telnet来实现的,仅支持tcp协议的端口. 代码 #...
    99+
    2023-05-16
    python检测IP端口 python Telnet测试端口 telnet批量查看端口开放
  • 如何建立云服务器端口协议服务端口命令方式
    首先,让我们来了解一下如何在命令行中建立端口协议服务端口。在命令行中建立端口协议服务端口的基本步骤是:打开终端、连接到远程服务器、使用终端的命令和选项、发送选项到终端。在这些步骤中,我们需要使用终端的命令和选项,并且需要使用端口选项来指明需...
    99+
    2023-10-27
    端口 命令 协议
  • 如何建立云服务器端口协议服务
    建立云服务器端口协议服务是一个比较复杂的任务,需要考虑许多因素,包括服务提供商、网络服务提供商和应用程序编程接口(API)等因素。下面是一种简单的方法来创建一个端口协议服务: 确定云服务器提供商:在开始创建云服务器端口协议服务之前,需要...
    99+
    2023-10-26
    端口 协议 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作