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. 如何将mysql卸载干净
  2. 8-12-COMPETITION
  3. 23. Spring Boot启动加载数据CommandLineRunner【从零开始学Spring Boot】
  4. 计算机英语词汇的特点,电子商务英语词汇都有哪些特点
  5. [转]在Visual Studio 2013/2015中设计UML活动图
  6. android 屏幕适配dimens,关于android:安卓屏幕适配一键生成dimens文件
  7. svn创建tag包的简单流程
  8. centos7从有线切换到无线_不需要软件,如何简单实现内外网自由切换?
  9. html搜索联系人,联系人列表.html
  10. 魅族系统怎么无需root激活Xposed框架的经验
  11. 推动铅蓄电池绿色“转身”
  12. unexpected error while obtaining UI hierarchy
  13. 一文带你轻松掌握多种编程范式
  14. 使用 Hyper-V 安装 Linux
  15. 河北万豪环保紫外线消毒器普及知识
  16. 计算机一级考试:选择题汇总D(精简版)
  17. 中缀和后缀表达式的转换
  18. 什么是消息队列(MQ)
  19. Python函数设计与使用
  20. Git 从0到入土 总结

热门文章

  1. ICDE2020|Predictive Task Assignment in Spatial Crowdsourcing: A Data-driven Approach
  2. 腾讯滨海大厦 智能楼宇 智慧建筑 3D可视化管理系统-优锘科技-ThingJS物联网开发案例...
  3. 利用visio 画思维导图
  4. 西工大计算机夏令营经验贴:2017~2019笔试、面试及完整流程
  5. 小程序源码:星座运势,周公解梦-多玩法安装简单
  6. 介绍ReLU6!计算机视觉实习面经(京东/商汤/思谋/依图/图森/字节/腾讯)
  7. Guava Futures异步回调机制源码解析
  8. HTML简易滚动图片
  9. 新编c语言程序设计实验钱雪忠答案,新编c语言程序设计教程机械工业出版社钱雪忠吕莹楠...
  10. CheckBox属性