error react 处理
2018-12-04 21:30:23 weixin_37098881 阅读数 110

1、epoll的同步编程方式
如果是listenfd,那么放入epoll继续监听
如果是可读fd,那么读取fd,并且处理读时间
int main(int argc, char** argv)
{
epoll_ctr(efd, ADD, fd);

while(1)
{
	epoll_wait(, event, ....);
	for(;;)
	{
		if(fd == listenr_scoket)
		{
			cfd = accept(...);
			epoll_ctr(efd, ADD, cfd);
		}
		else
		{
			read(fd, buf, size);//缺点2:对于所有的客户端的请求处理,变成了一种串行化的处理,如果某个请求很耗时,那么后面的请求势必阻塞起来,那么响应时间会变得很长。
			process(buf);
		}
	}
}

}

以上架构的缺点:
缺点:
1、所有的处理,都是epoll的线程里,会带来很大的压力(网络IO的压力)

半异步半同步编程

T1线程:

while(1)
{
epoll_wait(…)
for(;😉
{
if (fd == listenner_socket)
{
cfd = accpt(listenner_socket);
}
else
{
read(fd, buf, size);
enqueue(buf);
}
}
}
T2线程:

while (1)
{
wait_queue(buf);
process(buf);
}
示例如:
TODO

缺点:
1)线程间需要同步;
2)线程间有数据的拷贝(memcpy),这个拷贝也是很耗CPU的;
3)epoll所在的线程要处理所有的网络IO的读和写,这个线程的压力远远超过其余的业务处理线程。

纯异步 – Reactor设计

先来看libevent库

https://github.com/zhiyong0804/libevent_helloworld/blob/master/libevent_server.c

Reactor设计模式
在这里插入图片描述

Handles :表示操作系统管理的资源,我们可以理解为fd。
Synchronous Event Demultiplexer :同步事件分离器,阻塞等待Handles中的事件发生。
Initiation Dispatcher :初始分派器,作用为添加Event handler(事件处理器)、删除Event handler以及分派事件给Event handler。也就是说,Synchronous Event Demultiplexer负责等待新事件发生,事件发生时通知Initiation Dispatcher,然后Initiation Dispatcher调用event handler处理事件。
Event Handler :事件处理器的接口
Concrete Event Handler :事件处理器的实际实现,而且绑定了一个Handle。因为在实际情况中,我们往往不止一种事件处理器,因此这里将事件处理器接口和实现分开,与C++、Java这些高级语言中的多态类似。
Reactor与多线程的结合

可以参考EasyDarwin里使用Reactor设计模式与多线程的结合
reactor与线程结合

优点:
1)epoll_wait说在的线程只需要监听网络的事件发生,如socket的可读可写事件(EV_RE / EV_WR)然后封装成一个event,继而封装到一个Task。
2)把这个Task按照某种策略(轮询式的负载均衡或者固定到某个线程)压入线程池中某个线程的任务队列里,平摊了IO的性能和处理请求的均衡,提升总体效率;
3)设计变得更加具有模块化和可扩展性,对epoll反应堆没有任何影响;
4)并发实现,如果线程再设置CPU的亲缘性,则更加提高了网络性能。

另外一种架构是
epoll_wait将事件放入队列,然后让其他线程来取,让线程处理事件。

两种架构哪种效率高。
第一种会好:优点:一个是多CPU平摊网络IO,2可扩展性比较强

error react 处理 相关内容

2014-10-20 14:02:18 zxcbnmlei 阅读数 631

详细说明连接:http://blog.csdn.net/gashero/article/details/1519032


我的test:开启reactor.run(), 每3秒执行main()

from twisted.internet import reactor

import time

def main():
    reactor.callLater(3,main)
    print 'Current time is',time.strftime("%H:%M:%S")

if __name__ == '__main__':
    main()
    reactor.run()

error react 处理 相关内容

2018-12-21 16:15:54 weixin_44189883 阅读数 223

同步编程

while(1)
{
    epoll_wait(...)
    for(;;)
    {
        if (fd == listenner_socket)
        {
            cfd = accpt(listenner_socket);
        }
        else
        {
            read(fd, buf, size);
            process(buf);
        }
    }
}

示例如下:
https://github.com/zhiyong0804/net_io/blob/master/epoll/epollsvr.c

缺点:

  1. 所有的处理都放在同一个线程里,这个线程的压力很大,因为网络IO的处理总是比CPU要慢很多;
  2. 同时如果这里有一个客户端的请求,处理比较复杂,则会影响后面其它客户端的请求的响应时间;

半异步半同步编程

T1线程:

while(1)
{
    epoll_wait(...)
    for(;;)
    {
        if (fd == listenner_socket)
        {
            cfd = accpt(listenner_socket);
        }
        else
        {
            read(fd, buf, size);
            enqueue(buf);
        }
    }
}

T2线程:

while (1)
{
    wait_queue(buf);
    process(buf);
}

示例如:
TODO

缺点:
1)线程间需要同步;
2)线程间有数据的拷贝(memcpy),这个拷贝也是很耗CPU的;
3)epoll所在的线程要处理所有的网络IO的读和写,这个线程的压力远远超过其余的业务处理线程。

纯异步 – Reactor设计

先来看libevent库

https://github.com/zhiyong0804/libevent_helloworld/blob/master/libevent_server.c

Reactor设计模式

Reactor设计模式

  • Handles :表示操作系统管理的资源,我们可以理解为fd。
  • Synchronous Event Demultiplexer :同步事件分离器,阻塞等待Handles中的事件发生。
  • Initiation Dispatcher :初始分派器,作用为添加Event handler(事件处理器)、删除Event handler以及分派事件给Event handler。也就是说,Synchronous Event Demultiplexer负责等待新事件发生,事件发生时通知Initiation Dispatcher,然后Initiation Dispatcher调用event handler处理事件。
  • Event Handler :事件处理器的接口
  • Concrete Event Handler :事件处理器的实际实现,而且绑定了一个Handle。因为在实际情况中,我们往往不止一种事件处理器,因此这里将事件处理器接口和实现分开,与C++、Java这些高级语言中的多态类似。

Reactor与多线程的结合

可以参考EasyDarwin里使用Reactor设计模式与多线程的结合
reactor与多线程结合

优点:
1)epoll_wait说在的线程只需要监听网络的事件发生,如socket的可读可写事件(EV_RE / EV_WR)然后封装成一个event,继而封装到一个Task。
2)把这个Task按照某种策略(轮询式的负载均衡或者固定到某个线程)压入线程池中某个线程的任务队列里,平摊了IO的性能和处理请求的均衡,提升总体效率;
3)设计变得更加具有模块化和可扩展性,对epoll反应堆没有任何影响;
4)并发实现,如果线程再设置CPU的亲缘性,则更加提高了网络性能。

-- The End --
**可以扫我一起讨论技术**

扫我 扫我

error react 处理 相关内容

2019-03-21 15:51:13 yournevermore 阅读数 40

经过一番google , 得到了如下答案:

"The default reactor, by default, will install signal handlers to catchevents like Ctrl-C, SIGTERM, and so on. However, you can't install signalhandlers from non-main threads in Python, which means thatreactor.run() will cause anerror. Pass the installSignalHandlers=0 keyword argument toreactor.run (or Application.run) to work around this"

翻译一下:

" 默认情况下,默认反应器会将信号处理程序安装到诸如Ctrl-C,SIGTERM等催眠状态。但是,您无法在Python中安装来自非主线程的信号处理程序,这意味着反应器.run()将导致错误。传递installSignalHandlers = 0关键字参数到reactor.run(或Application.run)来解决这个问题 "

果断改为 "reactor.run(installSignalHandlers = 0)" 然后reactor就可以在非主线程中运行了,

Twisted 还是不太了解 , 抽时间要看看了....

error react 处理 相关内容

2012-04-26 10:59:36 lishuo102 阅读数 801

    使用Reactor框架处理信号;首先从ACE_Event_Handler类派生出一个子类,并实现它的方法handle_signal(),在这个方法中编写信号处理代码;然后,通过两个适当的register_handler()方法中的一个来登记信号事件处理器(新派生出来的类的对象)。

   处理信号的Reactor框架一旦启动起来,当捕捉到信号的时候,信号处理器对象的handle_signal()方法就会被Reactor框架回调,以响应信号的动作。

   在handle_signal()回调方法中,可以调用ACE_Reactor::instance()->notify(ACE_Event_Handler*)回调方法;来通知信号处理器做某件事情。


#include "ace/Reactor.h"

#include "ace/Event_Handler.h"
#include <signal.h>
class SignalHandler : public ACE_Event_Handler
{
    int handle_signal(int signum, siginfo_t * /* = 0 */, ucontext_t * /* = 0 */)
    {
        switch(signum)
        {
        case SIGINT:
            ACE_DEBUG((LM_DEBUG,ACE_TEXT("SIGINT!/n")));
            break;
        case SIGTERM:
            ACE_DEBUG((LM_DEBUG,ACE_TEXT("SIGTERM!/n")));
            break;
        case SIGBREAK:
            ACE_DEBUG((LM_DEBUG,ACE_TEXT("SIGBREAK!/n")));
            break;
        }
        return 0;
    }
};
int ACE_TMAIN(int argc, ACE_TCHAR* argv[])
{
    SignalHandler sh;
    ACE_Reactor::instance()->register_handler(SIGINT,&sh);
    ACE_Reactor::instance()->register_handler(SIGTERM,&sh);
    ACE_Reactor::instance()->register_handler(SIGBREAK,&sh);
    while(1)
    {
        ACE_Reactor::instance()->handle_events();
    }
    return 0;
}

error react 处理 相关内容

没有更多推荐了,返回首页