- #include <ros/ros.h>
- #include <iostream>
- #include <string>
- #include <cstring>
- // 名称空间映射表
- #include "k8s_sum/SumServiceImplPortBinding.nsmap"
- #include "k8s_sum/soapSumServiceImplPortBindingProxy.h"
- //using namespace std;
- #include <stdio.h>
- #include <iostream>
- #include <unistd.h>
- #include <fstream>
- #include <time.h>
- #include <sys/types.h>
- #define NUM 1000
- #define FORK_NUM 100
- // 获取当前时间
- double getCurrentTime(){
- struct timeval tv;
- gettimeofday(&tv,NULL);
- //return tv.tv_sec*1000+tv.tv_usec/1000;// 毫秒
- return tv.tv_sec*1000+tv.tv_usec/1000+tv.tv_usec%1000*0.001;// 毫秒带小数
- }
- // 计算数组内平均值
- double getAvgDiff(double *diffs){
- double sum = 0.0;
- for(int i=0;i<NUM;i++){
- sum +=*(diffs+i);
- }
- return sum/NUM;
- }
- // 总处理函数
- void handle(){
- // 输出到文件
- std::ofstream fout;
- int pid = getpid();
- std::string fileName="/tmp/rosSumfile_"+std::to_string(pid)+".dat";
- fout.open(fileName, std::iOS::App);
- double first_time;// 记录本次最开始时间
- double last_time;// 记录本次最后一次时间
- double avg_diff;// 平均响应时间
- double diffs[NUM] ={0.0};
- for(int i=0;i<NUM;i++){
- SumServiceImplPortBindingProxy sumwebservice;
- K8S1__getSum sumRequest;
- K8S1__getSumResponse res;
- int a,b;
- // 两个 1-100 的随机数
- a= rand() % 100;
- b= rand() % 100;
- sumRequest.arg0 = a;
- sumRequest.arg1 = b;
- std::cout<<"a="<<a<<",b="<<b<<std::endl;
- time_t tt = time(NULL);// 这句返回的只是一个时间戳 精确到秒
- //clock_t start_time,end_time; // 这个会精确到毫秒
- //start_time = clock();
- double start_time,end_time;
- start_time = getCurrentTime();
- if(i==0){
- first_time = start_time;// 记录第一次时间
- }
- fout<<"Current timestamp(k8s_sum) request(ms)="<<std::to_string(start_time);
- int result = sumWebservice.getSum(&sumRequest, res);
- //sleep(2); 暂停 2 秒
- if(SOAP_OK == result)
- {
- int sum_value = res.return_;
- //time_t tt1 = time(NULL);
- end_time = getCurrentTime();
- if(i+1==NUM){
- last_time = end_time;
- }
- fout<<",response(ms)="<<std::to_string(end_time);
- fout<<",the diff(ms)="<<end_time-start_time<<std::endl;
- diffs[i]=end_time-start_time;
- }else{
- fout<<",request is error!"<<std::endl;
- }
- }
- // 计算平均响应时间
- avg_diff = getAvgDiff(diffs);
- fout<<"Count firstTime="<<std::to_string(first_time)<<",lastTime="<<std::to_string(last_time)<<",avgDiff="<<avg_diff<<std::endl;
- fout.close();
- }
- int main(int argc, char **argv)
- {
- ros::init(argc, argv, "k8s_sum_node");
- pid_t pid;
- // 创建子进程
- for(int i=0;i<FORK_NUM;i++){
- pid = fork();
- // 子进程退出循环, 不再创建子进程, 全部由主进程创建子进程 , 这里是关键所在
- if(pid ==0 || pid == -1){
- break;
- }
- }
- if(pid == -1){
- ROS_INFO("Fail to Fork!");
- exit(1);
- }
- else if(pid == 0){
- // 子进程处理逻辑
- handle();
- sleep(5);
- exit(0);
- }
- else{
- // 主进程处理逻辑
- handle();
- exit(0);
- }
- ros::spin();
- return 0;
- }
- View Code
采用了 ROS 的编程方式
Web Service 模拟了一个 加法运算, 计算求和
来源: http://www.bubuko.com/infodetail-3146314.html