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))