• socket 多线程安全、粘包问题


    脚本如下:

    # -*- coding:utf-8 -*-
    '''
    @Author: Stefan
    
    @File:  server_listener.py
    
    @Date:  2016-11-09
    
    If you execute this test script on servers, you have to modify the system parameter below:
    sysctl net.ipv4.tcp_tw_recycle=1
    '''
    import sys
    sys.path.append('/export/servers/app/xxxx')
    import time
    import socket
    import threading
    import multiprocessing
    from src.xxxxclient.xxxx_client.lib.socket import header_pack, receive
    HEADER_LENGTH = 16
    DEFAULT_TCP_PORT = 1104
    DATA = {'xxxx_ADMIN': 'thread_keepalive'}
    
    count_of_processes = range(1)
    # DO NOT modify the parameter below
    count_of_threads = range(1)
    
    # Unit: second
    execute_time = 60
    
    def loop(times):
            """
    
            :return:
            """
            time_start_now = time.time()
            time_future = time_start_now + execute_time
            while True:
                if time_start_now > time_future:
                    break
                else:
                    time_start = time.time()
                    S = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    # S.connect(('127.0.0.1', DEFAULT_TCP_PORT))
                    S.connect(('x.x.x.x', DEFAULT_TCP_PORT))
                    header, data = header_pack(DATA, HEADER_LENGTH)
                    S.sendall(header+data)
                    header, result = receive(S, HEADER_LENGTH, 1024)
                    S.close()
                    time_end = time.time()
                    time_used = time_end - time_start
                    print "Thread lasted %.2f sec. Status: %s" % (time_used, result)
                    time_end_now = time.time()
                    time_gap = time_end_now - time_start_now
                    time_start_now += time_gap
    
    def multi_threads():
        """
    
        :return:
        """
        threads_list = list()
        for i in count_of_threads:
            t = threading.Thread(target=loop, args=str(count_of_threads[i]).split())
            threads_list.append(t)
    
        for i in count_of_threads:
            threads_list[i].start()
    
        for i in count_of_threads:
            threads_list[i].join()
    
    class muliti_process(multiprocessing.Process):
        """
    
        """
        def __init__(self):
            """
    
            :return:
            """
            multiprocessing.Process.__init__(self)
            self.processes_list = list()
    
        def run(self):
            """
    
            :return:
            """
            for i in count_of_processes:
                p = multiprocessing.Process(target=multi_threads,)
                self.processes_list.append(p)
    
            for i in self.processes_list:
                i.start()
    
    
    if __name__ == '__main__':
        p = muliti_process()
        global_start = time.time()
        p.start()
        p.join()
        global_end = time.time()
        global_used = global_end - global_start
        print "==================
    Total %.2f sec" % global_used
  • 相关阅读:
    FreeRTOS之源码 及 移植详解
    FreeRTOS之Tracealyzer for FreeRTOS(FreeRTOS+Trace) 详解(源码解析+移植)
    FreeRTOS之全配置项详解、裁剪(FreeRTOSConfig.h)
    linux下安装oracle中遇到的一些问题
    RedHat Enterprise Linux 6 配置Xmanager ,实现图形界面连接
    Linux ext2/ext3文件系统详解
    对固态硬盘ssd进行4k对齐
    在CentOs6.5安装jdk
    Android的API版本和名称对应关系
    Java反射机制及Method.invoke详解
  • 原文地址:https://www.cnblogs.com/stefan-liu/p/6138565.html
Copyright © 2020-2023  润新知