Swoole源码学习记录(十一)——Worker,Connection

本文详细分析了Swoole 1.7.5-stable版本中的Worker和Connection模块。Worker模块包括核心工作进程worker和任务工作进程task_worker,使用swWorker结构封装,包含进程池、通讯模式等属性。Connection模块用于存储客户端连接信息,包括连接时间、响应时间等,并提供了收发数据、关闭连接等功能。文章通过源码解读,阐述了Worker和Connection的创建、管理和通信机制。
摘要由CSDN通过智能技术生成

Swoole版本:1.7.5-stable

本章将分析Swoole中的三个比较重要的模块,Worker,ReactorProcess和Connection。其中Worker和ReactorProcess其实是对前面三章的一个补充,在前面的章节中为了分析结果的流畅性没有针对这些模块做特定分析,在此做出补充。

 

Worker模块

首先是Worker模块。Worker在Swoole中为核心工作进程的封装,包括用于处理核心逻辑的worker和用于处理任务的task_worker。在Swoole中使用了结构体swWorker来封装worker进程的相关属性,其声明在swoole.h文件中的727 – 787行,其声明如下:

struct _swWorker
{
         /**
          * worker process
          */
         pid_tpid;
 
         /**
          * worker thread
          */
         pthread_ttid;
 
         swProcessPool*pool;
 
         swMemoryPool*pool_output;
 
         swQueue*queue;
 
         /**
          * redirect stdout to pipe_master
          */
         uint8_tredirect_stdout;
 
         /**
          * worker status, IDLE or BUSY
          */
         uint8_tstatus;
 
         uint8_tipc_mode;
 
         /**
          * redirect stdin to pipe_worker
          */
         uint8_tredirect_stdin;
 
         /**
          * worker id
          */
         uint32_tid;
 
         /**
          * eventfd, process notify
          */
         swPipe*notify;
 
         /**
          * share memory store
          */
         struct
         {
                   uint8_tlock;
                   void*ptr;
         }store;
 
         intpipe_master;
         intpipe_worker;
         intpipe;
         intreactor_id;
         void*ptr;
         void*ptr2;
};

标有注释的变量就不说明了,大家一看就明白。剩下的几个,pool是个进程池,用于分配task_worker,pool_output用于存放task_worker执行结束后的结果,queue是消息队列,ipc_mode是进程间的通讯模式,pipe_master和pipe_worker是管道的fd,分别用于写消息到master进程和从master读取消息,pipe当然就是管道的id,reactor_id是该worker归属的reactor的标志。(ptr和ptr2待补充,实在没找到这俩变量在哪用的)

 

这里做一点补充,一个Worker中有两个管道,一个管道用于和master进程通信,一个管道用于和Reactor通信。而实际上如果指定了消息队列模式,则通信方式都是通过读写swQueue队列来实现的。这几点在之前的分析中已经有说明了,再此补充说明一下。

 

swWorker有四个操作函数,这些函数声明在Server.h文件中的545 – 548行,其声明如下:

int swWorker_create(swWorker *worker);
void swWorker_free(swWorker *worker);
void swWorker_signal_init(void);
void swWorker_signal_handler(int signo);

这四个函数声明在Worker.c中,其中swWorker_free只是释放了worker的store内存并且关闭了notify管道(不接收reactor消息),swWorker_signal_init指定了对应信号的回调函数,swWorker_signal_handler规定了对应信号的操作(基本——没内容,看一看就好……),这里只贴出swWorker_create的源码:

         void*store = sw_shm_malloc(SwooleG.serv->buffer_output_size);
         if(store == NULL)
         {
                   swWarn("mallocfor worker->store failed.");
                   returnSW_ERR;
         }
 
         swPipe*worker_notify = sw_malloc(sizeof(swPipe));
         if(worker_notify == NULL)
         {
                   swWarn("mallocfor worker->notify failed.");
                   sw_shm_free(store);
                   returnSW_ERR;
         }
 
         /**
          * Create notify pipe
          */
         if(swPipeNotify_auto(worker_notify, 1, 0))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值