1、multi异步接口实现文件上传demo

《1》、设置easy接口

#include <curl/curl.h>
#include <curl/multi.h>/* mutil 句柄的最大连接数 */
#define  MAX_CONNECT_HANDLE_NUMS  (15)/* 客制化的私有数据结构体 */
typedef struct CustomPrivData
{curl_mime *mime;struct curl_slist *headers;FILE* wfd;
}CustomPrivData;curl_global_init(CURL_GLOBAL_ALL);CURLM * m_MultiHandle  = curl_multi_init();curl_multi_setopt(m_MultiHandle, CURLMOPT_MAXCONNECTS, MAX_CONNECT_HANDLE_NUMS);CURLSH* m_ShareHandle = curl_share_init();if(m_ShareHandle){/* 设置DNS共享,不然每个easyhandle执行时都要解析一遍DNS */curl_share_setopt(m_ShareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);}CURL*   EasyCurlHandle = curl_easy_init();if(EasyCurlHandle){curl_easy_setopt(EasyCurlHandle, CURLOPT_FOLLOWLOCATION, 1L);struct curl_slist *headers = NULL;char Auth_header[256]={0};snprintf(Auth_header, 256, "Authorization:Bearer %s","test21334242");headers = curl_slist_append(headers, Auth_header);CustomPrivData* PrivData = new CustomPrivData;memset(PrivData, 0, sizeof(CustomPrivData));//headers = curl_slist_append(headers, "User-agent:Mozilla/5.0(Windows NT 6.1;Win64; x64)");//headers = curl_slist_append(headers, "Accept-Encoding:gzip,deflate");//headers = curl_slist_append(headers, "Accept-Language:zh-CN,zh;q=0.9");curl_easy_setopt(EasyCurlHandle, CURLOPT_HTTPHEADER, headers);PrivData->headers = headers;/* 设置DNS cache的超时时间为120s */curl_easy_setopt(EasyCurlHandle, CURLOPT_DNS_CACHE_TIMEOUT, 60*2);curl_easy_setopt(EasyCurlHandle, CURLOPT_SHARE, m_ShareHandle);curl_easy_setopt(EasyCurlHandle, CURLOPT_URL, url);         /* URL地址设置 */curl_easy_setopt(EasyCurlHandle, CURLOPT_NOSIGNAL, 1L);//curl_easy_setopt(m_EasyCurlHandle, CURLOPT_WRITEFUNCTION, NULL);//curl_easy_setopt(m_EasyCurlHandle, CURLOPT_WRITEDATA, NULL);curl_easy_setopt(EasyCurlHandle, CURLOPT_VERBOSE, 1);curl_easy_setopt(EasyCurlHandle, CURLOPT_CUSTOMREQUEST, "POST");curl_easy_setopt(EasyCurlHandle, CURLOPT_FOLLOWLOCATION, 1L);curl_easy_setopt(EasyCurlHandle, CURLOPT_DEFAULT_PROTOCOL, "https");curl_mime *mime;curl_mimepart *part;mime = curl_mime_init(EasyCurlHandle);part = curl_mime_addpart(mime);curl_mime_name(part, "file");curl_mime_filedata(part, file_path);curl_easy_setopt(EasyCurlHandle, CURLOPT_MIMEPOST, mime);PrivData->mime = mime;/* 设置私有数据用于curl_multi_perform执行后区分不同easy句柄 */curl_easy_setopt(EasyCurlHandle, CURLOPT_PRIVATE, PrivData);/* 添加到multi句柄 */curl_multi_add_handle(m_MultiHandle, EasyCurlHandle);/* headers、mime不能在此处释放 ,否则调用multi接口时奔溃*///curl_slist_free_all(headers);//curl_mime_free(mime);}

以上有两点注意:
1)、使用share接口实现DNS共享,加快处理速度;
2)、使用curl_easy_setopt(EasyCurlHandle, CURLOPT_PRIVATE, PrivData)设置私有数据,用于curl_multi_info_read调用之后区分不同的easyhandle;

《2》、开启线程处理函数

void* MultiperformFunc(void* ptr)
{m_IsStillRuning = true;int msgs_left = 0;int still_running = 0;while(m_IsStillRuning){CURLMcode mcode = curl_multi_perform(m_MultiHandle, &still_running);while(mcode == CURLM_CALL_MULTI_PERFORM){cout << "................ CURLM_CALL_MULTI_PERFORM ..............";mcode = curl_multi_perform(m_MultiHandle, &still_running);}//LOG_DEBUG << "still_running: " << still_running;CURLMsg *msg = NULL;int numfds = 0;/* wait for activity, timeout or "nothing" */int res = curl_multi_wait(m_MultiHandle, NULL, 0, 1000, &numfds);while((msg = curl_multi_info_read(m_MultiHandle, &msgs_left))){if(msg->msg == CURLMSG_DONE){CustomPrivData* PrivData = NULL;CURL *e = msg->easy_handle;curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &PrivData);//fprintf(stderr, "R: %d - %s <%s>\n",msg->data.result, curl_easy_strerror(msg->data.result), wfd);if(PrivData){/* 处理每个easyhandle的私有数据 */if(PrivData->wfd)fclose(PrivData->wfd);if(PrivData->headers)curl_slist_free_all(PrivData->headers);if(PrivData->mime)curl_mime_free(PrivData->mime);delete PrivData;PrivData = NULL;}/*当一个easy handler传输完成,此easy handler仍然仍然停留在multi stack中,调用curl_multi_remove_handle将其从multi stack中移除,然后调用curl_easy_cleanup将其关闭*/curl_multi_remove_handle(m_MultiHandle, e);curl_easy_cleanup(e);}else{//fprintf(stderr, "E: CURLMsg (%d)\n", msg->msg);cout << "curl Error: " << msg->msg;}}usleep(30*1000);}
}

2、参考

《1》、libcurl采用curl_multi_perform() + curl_multi_wait()方式实现异步高性能l发送数据的方法
《2》、libcurl的share interface与curl_easy_perform的性能

libcurl Multi异步接口使用相关推荐

  1. 异步接口同步返回_Dubbo客户端异步接口的实现背景和实践

    铺垫 先简单介绍下一次完整的Dubbo调用所经历的线程阶段.几个信息这里罗列下 Biz~代表业务线程,即便是业务逻辑处理所处的线程,Biz~线程池可能是业务自己创建维护,大多数的可能是系统框架自身管理 ...

  2. 任务队列和异步接口的正确打开方式(.NET Core版本)

    layout: post title: 任务队列和异步接口的正确打开方式(.NET Core版本) category: dotnet core date: 2019-01-12 tags: dotne ...

  3. java异步接口转同步接口_如果今天设计了Java:同步接口

    java异步接口转同步接口 Java已经走了很长一段路. 很长的路要走. 它带有早期设计决策中的所有"垃圾". 一遍又一遍后悔的一件事是, 每个对象(可能)都包含一个监视器 . 几 ...

  4. 技术实践丨如何解决异步接口请求快慢不均导致的数据错误问题?

    本文分享自华为云社区<如何解决异步接口请求快慢不均导致的数据错误问题?>,原文作者:Kagol . 引言 搜索功能,我想很多业务都会涉及,这个功能的特点是: 用户可以在输入框中输入一个关键 ...

  5. java当中怎么测试异步接口【杭州多测师_王sir】【杭州多测师】

    测试是软件发布的重要环节,单元测试在实际开发中是一种常用的测试方法,java单元测试主要用junit,最新是junit5,本人开发一般用junit4.因为单元测试能够在软件模块组合之前尽快发现问题,所 ...

  6. java单元测试异步不进去方法_java单元测试之如何实现异步接口的测试案例

    测试是软件发布的重要环节,单元测试在实际开发中是一种常用的测试方法,java单元测试主要用junit,最新是junit5,本人开发一般用junit4.因为单元测试能够在软件模块组合之前尽快发现问题,所 ...

  7. SpringBoot 异步接口

    一 什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行. 二 如何实现异步调用? ...

  8. Linux下使用hiredis库与libevent实现异步接口的I/O复用

    1 前言 之前的一篇文章<Linux下使用hiredis库实现优先级队列>,用的同步的接口实践: 后来遇到一个场景,同时需要处理Redis订阅的消息,又需要处理其他网络socket操作.定 ...

  9. SAP PO上传异步接口(PO从对方中间表读取数据)

    导语:最近的项目上出现了一个奇奇怪怪的需求,上传接口居然不是外围系统给我传输,而是他数据丢到他的中间表,然后PO去取过来,真就他不动,我自己动. 下面说一下需要怎么来实现吧,其实跟PO下传接口写入中间 ...

最新文章

  1. [Asp.net 5] Options-配置文件(2)
  2. 也许是东半球直接底气的分库分表实践了
  3. Data Set 投票
  4. python中类方法与实例方法的区别-python中类方法,实例方法,静态方法的作用和区别...
  5. 内存管理 初始化(七)kmem_cache_init_late 初始化slab分配器(下)
  6. 在Spring MVC中使用注解的方式校验RequestParams
  7. php 正则表达式 后向引用,php正则表达式 后向引用~ | 学步园
  8. 对于 APM 用户的一次真实调查分析(下)
  9. SVN版本管理trunk及branch相关merge操作
  10. ArcMAP获取要素的外包多边形
  11. NG-ZORRO 7.0.1 发布,Ant Design 的 Angular 实现
  12. GitHub上最火的40个Android开源项目(二)
  13. PCIE知识点-002:PCIE协议中的几种bridge
  14. c语言程序设计新教材,《C语言程序设计》教学大纲(新)教材.doc
  15. Mongodb安装详解及mongochef视图工具安装。
  16. vue项目中实现汉字转拼音缩写
  17. php生成二维码海报
  18. QTP中的Action有什么作用?有几种?
  19. 【毕设论文——必修篇】如何正确引用参考文献?让参考文献格式变标准
  20. 2022年开始了!武汉市企业牵头承担国家科技项目配套补贴申报条件材料及流程

热门文章

  1. ITE Super IO - 串口
  2. 前端渲染10w条数据
  3. pycharm中同一目录下py文件不能相互调用
  4. python 处理soap-post方法
  5. arch linux u盘安装,从U盘安装archlinux-2009.08完整过程 - Leo's Utopia
  6. 手机计算机两用u盘,手机电脑两用u盘_手机电脑两用u盘弊端
  7. 从零开发区块链应用(十三)--以太坊区块查询
  8. Web前端面试指导(五):掌握面试技巧,让面试变得轻松
  9. STL 标准模板库—容器部分【C++】
  10. cad缩小_CAD中的文字如何缩放、分解?原来CAD中的文字还有这么多学问