ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

十九、客户端多线程分组模拟高频并发数据

2022-01-29 12:06:31  阅读:206  来源: 互联网

标签:int t1 client 线程 EasyTcpClient 多线程 十九 客户端


客户端多线程分组模拟高频并发数据

前言

之前我们学习了多线程的基础知识,接来我们将使用多线程对客户端进行升级
实现客户端多线程分组模拟高频发送数据,来测试服务端的单线程的效率瓶颈

一、客户端升级模型

1、设计概述

使用C++11提供的多线程接口设计客户端程序,创建指定数量的客户端,然后将客户端的任务平均到每个线程中进行执行

2、设计思路

1、创建一个UI线程,其线程执行函数为cmdThread(),用于输入命令退出程序
2、创建一个全局客户端数组client,其中存储客户端对象
3、为了将所有客户端的任务平均,我们设定了一个全局变量tCount,代表要创建多少个客户端数据处理线程
4、在main()中创建tCount数量的线程,每个线程中所操作的客户端数量平均,线程执行函数为sendThread()
在这里插入图片描述

二、测试

  • 测试环境 -> Windows本地 -> Release86

t -> 代表线程数
c -> 代表客户端连接数
m -> 代表消息大小
x1 -> 代表每次发送消息数量

1、EasyTcpServer_t1_c1024 -> EasyTcpClient_t1_c1000_m100x1

在这里插入图片描述

2、EasyTcpServer_t1_c1024 -> EasyTcpClient_t4_c1000_m100x1

在这里插入图片描述

3、EasyTcpServer_t1_c1024*4 -> EasyTcpClient_t4_c4000_m100x1

在这里插入图片描述

4、测试结论

  • 我们可以看到,服务端在单线程,FD_SIZE=1024的情况下
    • 客户端使用单线程,1000连接,每个发送100K的消息包,服务端每秒可以处理8万多消息包
    • 客户端使用4线程,1000连接,每个发送100K的消息包,服务端每秒可以处理60多万消息包
    • 客户端使用4线程,4000连接,每个发送100K的消息包,服务端每秒可以处理40多万消息包
  • 客户端使用了多线程的情况下,这样可以通过连接数或者消息包的数量来提高客户端的消息发送频率
    • 这样可以帮助测试服务端性能瓶颈

三、完整代码

这里只修改了client.cpp的代码,其他的代码没有修改(参考“十三、添加高精度计时器测试性能”)

1、client.cpp

#include "EasyTcpClient.hpp"
#include<thread>

bool g_bRun = true;
void cmdThread()
{
	while (true)
	{
		char cmdBuf[256] = {};
		scanf("%s", cmdBuf);
		if (0 == strcmp(cmdBuf, "exit"))
		{
			g_bRun = false;
			printf("退出cmdThread线程\n");
			break;
		}
		else {
			printf("不支持的命令。\n");
		}
	}
}

//客户端数量
const int cCount = 4000;
//发送线程数量
const int tCount = 4;
//客户端数组
EasyTcpClient* client[cCount];

void sendThread(int id)
{
	//4个线程 ID 1~4
	int c = cCount / tCount;
	int begin = (id - 1) * c;
	int end = id * c;

	for (int n = begin; n < end; n++)
	{
		client[n] = new EasyTcpClient();
	}
	for (int n = begin; n < end; n++)
	{
		client[n]->Connect("127.0.0.1", 4567);
		printf("thread<%d>,Connect=%d\n", id, n);
	}

	std::chrono::milliseconds t(5000);
	std::this_thread::sleep_for(t);

	Login login;
	strcpy(login.userName, "lyd");
	strcpy(login.PassWord, "lydmm");
	while (g_bRun)
	{
		for (int n = begin; n < end; n++)
		{
			client[n]->SendData(&login);
			//client[n]->OnRun();
		}
	}

	for (int n = begin; n < end; n++)
	{
		client[n]->Close();
	}
}

int main()
{
	//启动UI线程
	std::thread t1(cmdThread);
	t1.detach();

	//启动发送线程
	for (int n = 0; n < tCount; n++)
	{
		std::thread t1(sendThread, n + 1);
		t1.detach();
	}

	while (g_bRun)
		Sleep(100);

	printf("已退出。\n");
	return 0;
}

标签:int,t1,client,线程,EasyTcpClient,多线程,十九,客户端
来源: https://blog.csdn.net/qq23001186/article/details/122724835

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有