利用transfer_pool进行批量并发下载

TBOX提供上层高度封装的传输池来进行客户端的并发批量下载、上传、文件复制、socket数据透传等io传输需求。

投递到transfer_pool传输池的所有任务都是异步并发处理的。如果对并发量要求不高的话,例如客户端应用,那么使用全局的tb_transfer_pool()就足够了。

全局的transfer_pool使用了全局的tb_aicp(),并且考虑到大部分客户端应用,并发量不是很高,因此对资源需求做了些限制,一般比较适合并发量小于100的场合。

如果需要高并发的情况,则可以通过tb_transfer_pool_init、tb_aicp_init手动创建:transfer_pool和aicp,指定aicp需要的并发量,来提高并发需求。

如果要对每个io传输更加灵活的控制,可以直接使用async_transfer,自己上层做管理就行了。

// 传输信息回调函数
static tb_bool_t tb_demo_transfer_done_func(tb_size_t state, tb_hize_t offset, tb_hong_t size, tb_hize_t save, tb_size_t rate, tb_cpointer_t priv)
{
    // 计算进度
    tb_size_t percent = 0;
    if (size > 0) percent = (tb_size_t)((offset * 100) / size);
    else if (state == TB_STATE_OK) percent = 100;

    // 打印信息
    tb_trace_i("save[%s]: %llu, rate: %lu bytes/s, percent: %lu%%, state: %s", priv, save, rate, percent, tb_state_cstr(state));

    // 继续下载
    return tb_true;
}

// 投递几个http下载任务
tb_transfer_pool_done(tb_transfer_pool(), "http://www.xxxx.com/file1", "/tmp/a", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));
tb_transfer_pool_done(tb_transfer_pool(), "http://www.xxxx.com/file2", "/tmp/b", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));

// 投递几个https下载任务
tb_transfer_pool_done(tb_transfer_pool(), "https://www.xxxx.com/file3", "/tmp/c", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));
tb_transfer_pool_done(tb_transfer_pool(), "https://www.xxxx.com/file4", "/tmp/d", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));

// 投递几个文件copy任务
tb_transfer_pool_done(tb_transfer_pool(), "/tmp/file1", "/tmp/e", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));
tb_transfer_pool_done(tb_transfer_pool(), "/tmp/file2", "/tmp/f", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));

// 投递几个文件copy任务
tb_transfer_pool_done(tb_transfer_pool(), "/tmp/file1", "/tmp/g", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));

// 在windows下投递文件copy任务
tb_transfer_pool_done(tb_transfer_pool(), "c://xxxx/file2", "c://tmp/h", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));

// 投递tcp socket传输任务
tb_transfer_pool_done(tb_transfer_pool(), "sock://127.0.0.1", "/tmp/i", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));

// 投递udp socket传输数据到其他对方tcp socket服务器上
tb_transfer_pool_done(tb_transfer_pool(), "sock://127.0.0.1/?udp=", "sock://xxx.xxx.xxx.xxx", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));

/*! 投递异步io传输任务到传输池:iurl => ourl
 *
 * @param pool          传输池,默认可以使用全局的tb_transfer_pool(),也可以自己创建私有的pool
 * @param iurl          输入url
 * @param ourl          输出url
 * @param offset        源端开始传输的数据offset,一般只要传0就行了
 * @param rate          指定限速值,传0为默认无限速
 * @param done          传输信息回调函数,间隔1s调用一次
 * @param ctrl          控制参数设置回调函数,在开始传输前,对io的传输做一些参数控制
 * @param priv          用户传入的私有数据
 *
 * @return              投递成功:tb_true,投递失败:tb_false
 */
tb_bool_t               tb_transfer_pool_done(tb_transfer_pool_ref_t pool, tb_char_t const* iurl, tb_char_t const* ourl, tb_hize_t offset, tb_size_t rate, tb_async_transfer_done_func_t done, tb_async_transfer_ctrl_func_t ctrl, tb_cpointer_t priv);

其中对于传输参数控制的回调函数使用,可以参考TBOX提供的spider demo程序。


时间: 2024-12-12 13:56:44

利用transfer_pool进行批量并发下载的相关文章

利用Python实现批量下载腾讯视频!

导语 利用Python下载腾讯非VIP视频,也就是可以免费观看的视频.做这个的起因是最近在看一个叫"请吃红小豆吧"的动漫,一共三分钟的动漫,广告时间竟然要一分钟,实在忍无可忍,于是干脆写个脚本把动漫都先下载下来再看,顺便过来分享一波,让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: PIL模块: requests模块: click模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 做之前

SFTP基于Key多进程批量并发上传文件实现案例(python)

最近在研究Paramiko,Paramiko可以非常方便的实现基于SSH协议的远程连接,可以基于 口令,也可以无口令RSA非对称密钥,亦可以实现SFTP上传下载操作,安全高效,再结合多 进程或者是多线程就可以实现并行处理,写了一个简单的SFTP基于Key多进程批量并发上传 文件的实现案例,供以后参考. 安装加密模块和Paramiko模块 下载:pycrypto-2.6.1.tar.gz paramiko-1.10.1.tar.gz 安装: tar -zxf pycrypto-2.6.1.tar.

利用SecureCRT上传、下载文件(使用sz与rz命令),超实用!

    借助securtCRT,使用linux命令sz可以很方便的将服务器上的文件下载到本地,使用rz命令则是把本地文件上传到服务器.     其中,对于sz和rz的理解与记忆我用了如下的方法(很多时候容易搞混):     sz中的s意为send(发送),告诉客户端,我(服务器)要发送文件 send to cilent,就等同于客户端在下载.     rz中的r意为received(接收),告诉客户端,我(服务器)要接收文件 received by cilent,就等同于客户端在上传.    

Java批量压缩下载

最近做了一些有关批量压缩下载的功能,网上也找了一些资源,但都不是太全面,所以自己整理一份,已备不时之需. 直接上代码: // 获取项目路径 private static String WEBCLASS_PATH = Thread.currentThread().getContextClassLoader().getResource("").getPath(); // 获取webinf路径 private static String WEBINF_PATH = WEBCLASS_PATH

Visual studio 利用Nuget 控制台安装已经下载好的插件

利用Nuget 控制台安装已经下载好的插件 1 打开控制台 Tools > Library Package Manager > Package Manager Console 2 设置package source 为 安装包所在目录 3 输入以下命令 get-package -remote -filter entityframework install-package -id EntityFramework

利用DEDE正则批量查找替换数据库的自定义内容

正则的表达式在MY SQL中也有应用,但是在具体将查找的东西直接进行Replace的时候目前还不能解决,幸好后台中有个dede利用 正则,利用dede正则批量替换数据库中内容,这样我们完全减小了自己的工作量了. 例如网站的一个例子, 是替换一个div中的内容,摘抄实践下,关键还是自己去体会,多用下正则,还是不错的.正则相关的文章我在我的博客中也多次 提到了他的多种运用途径.如果你都掌握好它的话,你的工作效率就会成倍的提高了.下面这个正则的用途是查找数据库的中自 定义的DIV层中运用,一般这种用法

利用谷歌实现批量入侵的方法 -中国寒龙

route print 查看本机设置网络 intext:这个就是把网页中的正文内容中的某个字符做为搜索条件.例如在google里输入:intext:动网.将返回所有在网页正文部分包含"动网"的网页.allintext:使用方法和intext类似. intitle: 和上面那个intext差不多,搜索网页标题中是否有我们所要找的字符.例如搜索:intitle:安全天使.将返回所有网页标题中包含"安全天使"的网页.同理allintitle:也同intitle类似. ca

自己动手写简单的web应用服务器(4)—利用socket实现文件的下载

直接上源码: 服务器: 1 package download; 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.IOException; 8 import java.io.OutputStream; 9 import java.net.Ser

利用DataTable快速批量导数据

DataSet ds = new DataSet();            using (SqlConnection conn = new SqlConnection(@"data source=.\sqlxu;initial catalog=NationalUnion20140717;persist security info=True;user id=sa;password=101;MultipleActiveResultSets=True"))            {