网络爬虫十六-扩展为多任务爬虫

高效的网络爬虫是搜索引擎的重要基础。采用多任务并发执行,实现类似于CPU的流水线(pipeline)运行方式,可极大地提高网络和计算资源的利用率等性能。

#include "threads.h"
#include "spider.h"  
#include "confparser.h"  

/* the number of current running thread */  
int g_cur_thread_num = 0;  

/* lock for changing g_cur_thread_num's value */  
pthread_mutex_t gctn_lock = PTHREAD_MUTEX_INITIALIZER;  

int create_thread(void *(*start_func)(void *), void * arg, pthread_t *pid, pthread_attr_t * pattr)  
{  
    pthread_attr_t attr;  
    pthread_t pt;  

    if (pattr == NULL) {  
        pattr = &attr;  
        pthread_attr_init(pattr);  
        pthread_attr_setstacksize(pattr, 1024*1024);  
        pthread_attr_setdetachstate(pattr, PTHREAD_CREATE_DETACHED);  
    }  

    if (pid == NULL)  
        pid = &pt;  

    int rv = pthread_create(pid, pattr, start_func, arg);  
    pthread_attr_destroy(pattr);  
    return rv;  
}  

void begin_thread()  
{  
    SPIDER_LOG(SPIDER_LEVEL_DEBUG, "Begin Thread %lu", pthread_self());  
}  

void end_thread()  
{  
    pthread_mutex_lock(&gctn_lock);   
    int left = g_conf->max_job_num - (--g_cur_thread_num);  
    if (left == 1) {  
        /* can start one thread */  
        attach_epoll_task();  
    } else if (left > 1) {  
        /* can start two thread */  
        attach_epoll_task();  
        attach_epoll_task();  
    } else {  
        /* have reached g_conf->max_job_num , do nothing */  
    }  
    SPIDER_LOG(SPIDER_LEVEL_DEBUG, "End Thread %lu, cur_thread_num=%d", pthread_self(), g_cur_thread_num);  
    pthread_mutex_unlock(&gctn_lock);     
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值