Swoole源码学习记录(九)——Factory模块(上)

Swoole版本:1.7.5-stable

Factory这个命名让我一度认为这是一个工厂模型……这个工厂实际上并不负责生产实例,而是根据类型的不同执行两项任务:Factory实现的功能是一个任务中心,一个task请求进入Factory,会进过dispatch分配、onTask处理、onFinish交付结果一系列流程;FactoryProcess用于管理manager和worker进程,也有对单独的writer线程的管理。

(PS:Swoole源码中有FactoryThread模块,该模块是一个多线程模型,根据开发者Rango韩少的解释,因为PHP不支持多线程,所以无法使用这个模块,因此该模块被废弃了。而实际上,FactoryThread比FactoryProcess要更简洁……)

 

Factory模块

Factory模块的相关声明在Server.h头文件中。首先是一个在Factory模块中被用到的结构体swDispatchData,该结构体声明在Server.h的145 – 149 行,声明如下:

typedef struct
{
   long target_worker_id;
   swEventData data;
} swDispatchData;

swDispatchData存放了一个目标worker进程的id和一条数据,该结构体用于传递数据给task进程进行处理。

Swoole中用swFactory结构体封装了Factory模块的相关操作,其声明在Server.h文件中的151 – 168行,其声明如下:

struct _swFactory
{
   void *object;
   void *ptr; //server object
   int last_from_id;
 
   swReactor *reactor; //reserve for reactor
 
   int (*start)(struct _swFactory *);
   int (*shutdown)(struct _swFactory *);
   int (*dispatch)(struct _swFactory *, swDispatchData *);
   int (*finish)(struct _swFactory *, swSendData *);
   int (*notify)(struct _swFactory *, swDataHead *);    //send a event notify
   int (*end)(struct _swFactory *, swDataHead *);
 
   int (*onTask)(struct _swFactory *, swEventData *task); //workerfunction.get a task,goto to work
   int (*onFinish)(struct _swFactory *, swSendData *result); //factoryworker finish.callback
};

其中object用于存放一个具体的Factory类型(FactoryProcess or FactoryThread),last_from_id存放了最近一个通过该Factory发送消息的reactor的id。

swFactory的全部操作函数都声明在Server.h的176 – 183行,声明如下:

int swFactory_create(swFactory *factory);
int swFactory_start(swFactory *factory);
int swFactory_shutdown(swFactory *factory);
int swFactory_dispatch(swFactory *factory,swDispatchData *req);
int swFactory_finish(swFactory *factory,swSendData *_send);
int swFactory_notify(swFactory *factory,swDataHead *event);
int swFactory_end(swFactory *factory,swDataHead *cev);
int swFactory_check_callback(swFactory*factory);

这些函数在Factory.c中被定义。其中,start和shutdown函数简单返回SW_OK,create函数仅将传入的factory中的各个函数赋值(其实onTask和onFinish还是外部赋值……),callback函数仅仅检查onTask和onFinish两个函数指针是否为空,剩下的函数都是根据传入的参数调用对应的PHP回调函数(dispatch调用onTask,notify调用onClose和onConnect,end调用onClose并调用swServer_connection_close函数(详细分析见附录)关闭对应的connect连接)

这里需要分析一下swFactory_finish函数。swFactory_finish是一个通道,它的作用是将task运行结束后的数据发送给对应的Reactor。其核心源码如下:

   //unix dgram
   if (resp->info.type == SW_EVENT_UNIX_DGRAM)
    {
       socklen_t len;
       struct sockaddr_un addr_un;
       int from_sock = resp->info.from_fd;
 
       addr_un.sun_family = AF_UNIX;
       memcpy(addr_un.sun_path, resp->sun_path, resp->sun_path_len);
       len = sizeof(addr_un);
       ret = swSendto(from_sock, resp->data, resp->info.len, 0, (structsockaddr *) &addr_un, len);
       goto finish;
    }
   //UDP pacakge
   else if (resp->info.type == SW_EVENT_UDP || resp->info.type ==SW_EVENT_UDP6)
    {
       ret 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值