每日一题_Python.利用yield生成器实现协程下的tps透明传输CS测试

具体需求:
1. 模拟Device首先发送注册包注册到TPS服务器,然后Client发送私有数据包到TPS,测试Device可以接收到私有数据包则返回成功或标志位(0, ‘‘)或(1, ‘errormsg‘)
2. 由于此插件是用于自己写的插件式监控系统,所以入口函数名必须和文件名保持一致,这里暂定为server_tps_status.py

实现思路:

具体代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# OsChina: http://xmdevops.blog.163.com/
# Purpose:
# Install:
#
"""
# 说明: 导入公共模块
import json
import socket

def device_send_recv(device_socket, tps_host, tps_port, private_data, extra_data):
    send_data = {
        "TransProxy": {
            "Body": {
                ‘AuthCode‘: ‘0000000000000000‘,
                ‘SerialNumber‘: ‘0000000000000000‘
            },
            ‘Header‘: {
                ‘CSeq‘: ‘1‘,
                ‘MessageType‘: ‘MSG_TRANSPROXY_REGISTER_REQ‘,
                ‘TerminalType‘: ‘Camera‘,
                ‘Version‘: ‘1.0‘
            }
        }
    }
    send_data = json.dumps(send_data)
    send_data = ("POST /TransProxy HTTP/1.1\r\n"
                 "Host:%s\r\n"
                 "Port:%s\r\n"
                 "Connection:keep-alive\r\n"
                 "Content-Length:%s\r\n\r\n"
                 "%s\r\n"
                 ) % (tps_host, tps_port, len(send_data), send_data)
    device_socket.send(send_data)
    while True:
        cur_buffer = device_socket.recv(1024)
        if ‘TransProxy‘ in cur_buffer:
            yield (0, ‘‘)
        elif private_data in cur_buffer:
            yield (0, ‘‘)
            break
        else:
            yield (1, cur_buffer)
            break

def client_send_recv(device_socket, tps_host, tps_port, private_data, extra_data):
    send_data = ("POST /PrivateData HTTP/1.1\r\n"
                 "Host:%s\r\n"
                 "Port:%s\r\n"
                 "AuthCode:%s\r\n"
                 "SrcUuid:%s\r\n"
                 "DestUuid:%s\r\n"
                 "Connection:keep-alive\r\n"
                 "Content-Length:%s\r\n\r\n"
                 "%s\r\n"
                 ) % (tps_host, tps_port, extra_data[0], extra_data[1],
                      extra_data[2], len(private_data), private_data)
    device_socket.send(send_data)

def service_tps_status():
    private_data = ‘xmdevops‘
    exec_ret_dicts = {‘status‘: 0, ‘target‘: 0, ‘errors‘: ‘‘}
    tps_host, tps_port = ‘127.0.0.1‘, 6604
    extra_data = (
        ‘02899574bd6e899060‘,
        ‘1111111111111111‘,
        ‘0000000000000000‘,
    )
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    device_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        client_socket.connect((tps_host, tps_port))
        device_socket.connect((tps_host, tps_port))
    except socket.error, e:
        exec_ret_dicts.update({
            ‘status‘: 1,
            ‘target‘: 1,
            ‘errors‘: e.strerror,
        })
        return exec_ret_dicts

    device = device_send_recv(device_socket, tps_host, tps_port, private_data, extra_data)
    device.next()
    client_send_recv(client_socket, tps_host, tps_port, private_data, extra_data)
    while True:
        try:
            result = device.next()
        except StopIteration, e:
            break
    exec_ret_dicts.update({
        ‘status‘: result[0],
        ‘target‘: result[0],
        ‘errors‘: result[1],
    })
    return exec_ret_dicts

if __name__ == ‘__main__‘:
    print(service_tps_status())
时间: 2024-10-08 10:44:17

每日一题_Python.利用yield生成器实现协程下的tps透明传输CS测试的相关文章

每日一题_Python.利用gevent和pipeline快速导出近千万Redis字段值?

事情缘由: 昨日下午工信部前来,几个看似很专业搞安全的非要让现场写脚本导出几百万条Redis记录中的IP字段,由于之间确实没想过如何快速导出这么多数据,只能尴尬认怂~但下来仔细想想我们可以做到~办法总比困难多~ 具体需求: 1. 快速导出Redis中只包含[0-9a-z]组成的16序列号下的WlanIP字段 实现思路: 1. 必然先想到多线程/多进程/多协程,最终选择gevent协程池的原因的是涉及到Redis读和文件写操作,相对于多进程/多线程更容易控制且时间不会浪费在阻塞上,异步来回切换更适

Python生成器:单线程协程

1 #author F 2 3 #单线程下的并行效果 (生成器) 4 #协程 5 6 import time 7 def consumer(name): 8 print("%s 准备吃包子啦" %name) 9 while True: 10 baozi = yield 11 print("包子%s来啦 被%s吃啦!" %(baozi, name)) 12 13 c = consumer("WW") #此时的consumer已经不是函数 他是一个生

python基础----迭代器、生成器、协程函数

一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法) 3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象. 二,为什么要用迭代器 优点: 1:迭代器提供了一种不依赖于索引的取值方式,

生成器与协程 | Python

# 生成器与协程 # 生成器是一种特殊的迭代器,它同样生成一个值的序列; # 如何定义生成器? # 方法一:函数中使用yield关键字; class count_down(n): while n>0: yield n n-=1 # 创建一个生成器对象 c = count_down(10) # __next__()方法调用生成器; >> c.__next__() 10 # 生成器对象提供了close()方法,来避免部分消耗; # 即:停止使用生成器时,就会自动调用close()方法; cl

python yield、yield from与协程

从生成器到协程 协程是指一个过程,这个过程与调用方协作,产出由调用方提供的值.生成器的调用方可以使用 .send(...)方法发送数据,发送的数据会成为yield表达式的值.因此,生成器可以作为协程使用. 从句法上看,生成器与协程都是包含yield关键字的函数.但是,在协程中,yield通常出现在表达式的右边(* = yield *),可以产出值一可以不产出(yield关键字后边没有表达式,产出None). 协程有四个状态: GEN_CREATED:等待开始执行 GEN_RUNNING:正在执行

生成器、协程(yield)

来自: https://en.wikipedia.org/wiki/Coroutine 生成器,也称为semicoroutines,[5]也是子程序的泛化,但比协同程序更受限制. 具体来说,虽然这两个都可以多次产生,暂停它们的执行并允许在多个入口点重新进入,但是它们的不同之处在于,协同程序可以控制在它们屈服之后执行继续的位置,而发生器不能,而是将控制转移回生成器的调用者 .[6] 也就是说,由于生成器主要用于简化迭代器的写入,所以生成器中的yield语句不指定要跳转到的协程,而是将值传递回父例程

Python快速学习第十二天--生成器和协程

yield指令,可以暂停一个函数并返回中间结果.使用该指令的函数将保存执行环境,并且在必要时恢复. 生成器比迭代器更加强大也更加复杂,需要花点功夫好好理解贯通. 看下面一段代码: [python] view plain copy def gen(): for x in xrange(4): tmp = yield x if tmp == 'hello': print 'world' else: print str(tmp) 只要函数中包含yield关键字,该函数调用就是生成器对象. [pytho

迭代器--》生成器--》协程的关系与区别

1.迭代器(iterator) 是一个实现了迭代器协议的对象,python的一些内置数据类型(列表,数组,字符串,字典等)都可以通过for语句进行迭代,我们也可以自己创建一个容器,实现了迭代器协议,可以通过for,next方法进行迭代,在迭代的末尾,会引发stopIteration异常. 判断xxx_obj是否可以迭代 在第1步成立的前提下,调用 iter 函数得到 xxx_obj 对象的 __iter__ 方法的返回值 __iter__ 方法的返回值是一个迭代器 如果想要一个对象称为一个 可以

生成器和协程干货

理解生成器 定义生成器 yield关键字,可以让我们定义一个生成器函数. def generator_func(): print('a') yield 1 g = generator_func() print(g) >>> <generator object generator_func at 0x10e178b88> 推动生成器 使用next函数从生成器中取值 def generator_func(): print('a') yield 1 g = generator_fu