libevent带负载均衡的多线程使用示例
- eventtest : eventtest.c
- gcc -Wall -g -levent -lpthread -o eventtest eventtest.c
- .PHONY : clean
- clean :
- rm eventtest -f
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <pthread.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <event.h>
- typedef struct {
- pthread_t tid;
- struct event_base *base;
- struct event event;
- int read_fd;
- int write_fd;
- }LIBEVENT_THREAD;
- typedef struct {
- pthread_t tid;
- struct event_base *base;
- }DISPATCHER_THREAD;
- const int thread_num = 10;
- LIBEVENT_THREAD *threads;
- DISPATCHER_THREAD dispatcher_thread;
- int last_thread = 0;
- static void
- thread_libevent_process(int fd, short which, void *arg)
- {
- int ret;
- char buf[128];
- LIBEVENT_THREAD *me = arg;
- if (fd != me->read_fd) {
- printf("thread_libevent_process error : fd != me->read_fd\n");
- exit(1);
- }
- ret = read(fd, buf, 128);
- if (ret > 0) {
- buf[ret] = '\0';
- printf("thread %llu receive message : %s\n", (unsigned long long)me->tid, buf);
- }
- return;
- }
- static void *
- worker_thread(void *arg)
- {
- LIBEVENT_THREAD *me = arg;
- me->tid = pthread_self();
- event_base_loop(me->base, 0);
- return NULL;
- }
- static void
- timeout_cb(int fd, short event, void *arg)
- {
- struct timeval tv;
- struct event *timeout = arg;
- int tid = (last_thread + 1) % thread_num; //memcached中线程负载均衡算法
- LIBEVENT_THREAD *thread = threads + tid;
- last_thread = tid;
- write(thread->write_fd, "Hello world!", sizeof("Hello world!") - 1);
- evutil_timerclear(&tv);
- tv.tv_sec = 1;
- event_add(timeout, &tv);
- }
- int
- main (int argc, char *argv[])
- {
- int ret;
- int i;
- int fd[2];
- struct event timeout;
- struct timeval tv;
- pthread_t tid;
- dispatcher_thread.base = event_init();
- if (dispatcher_thread.base == NULL) {
- perror("event_init( base )");
- return 1;
- }
- dispatcher_thread.tid = pthread_self();
- threads = calloc(thread_num, sizeof(LIBEVENT_THREAD));
- if (threads == NULL) {
- perror("calloc");
- return 1;
- }
- for (i = 0; i < thread_num; i++) {
- ret = socketpair(AF_LOCAL, SOCK_STREAM, 0, fd);
- if (ret == -1) {
- perror("socketpair()");
- return 1;
- }
- threads[i].read_fd = fd[1];
- threads[i].write_fd = fd[0];
- threads[i].base = event_init();
- if (threads[i].base == NULL) {
- perror("event_init()");
- return 1;
- }
- event_set(&threads[i].event, threads[i].read_fd, EV_READ | EV_PERSIST, thread_libevent_process, &threads[i]);
- event_base_set(threads[i].base, &threads[i].event);
- if (event_add(&threads[i].event, 0) == -1) {
- perror("event_add()");
- return 1;
- }
- }
- for (i = 0; i < thread_num; i++) {
- pthread_create(&tid, NULL, worker_thread, &threads[i]);
- }
- evtimer_set(&timeout, timeout_cb, &timeout);
- event_base_set(dispatcher_thread.base, &timeout);
- evutil_timerclear(&tv);
- tv.tv_sec = 1;
- event_add(&timeout, &tv);
- event_base_loop(dispatcher_thread.base, 0);
- return 0;
- }
libevent带负载均衡的多线程使用示例的更多相关文章
- Ribbon自带负载均衡策略比较
Ribbon自带负载均衡策略比较 策略名 策略声明 策略描述 实现说明 BestAvailableRule public class BestAvailableRule extends ClientC ...
- Ribbon自带负载均衡策略
IRule这是所有负载均衡策略的父接口,里边的核心方法就是choose方法,用来选择一个服务实例. AbstractLoadBalancerRuleAbstractLoadBalancerRule是一 ...
- HAProxy(二):HAProxy的ACL规则实现智能负载均衡详解与示例
一.HAProxy的ACL的功能 ACL(Access Control List)访问控制列表,HAProxy中的ACL的匹配条件和控制条件有许多种,功能很强大,可以通过源地址.源端口.目标地址.目标 ...
- apache、mod_jk负载均衡与tomcat集群
最近需要搭建apache和tomcat的集群,实现静态网站直接通过apache访问,动态网站转交给tomcat处理,实现负载均衡和tomcat集群配置. apache安装 wget http://ap ...
- nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理
Nginx除了可以用作web服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案.nginx可以用轮询.IP哈希.URL哈希等方式调度后端服务器,同时也能提供健康检查功能 ...
- 客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍
Netflix:['netfliːks] ribbon:英[ˈrɪbən]美[ˈrɪbən]n. 带; 绶带; (打印机的) 色带; 带状物;v. 把…撕成条带; 用缎带装饰; 形成带状; L ...
- Dubbo学习(二) Dubbo 集群容错模式-负载均衡模式
Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...
- (转)nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理
Nginx除了可以用作web服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案.nginx可以用轮询.IP哈希.URL哈希等方式调度后端服务器,同时也能提供健康检查功能 ...
- spring-cloud-starter-ribbon提供客户端的软件负载均衡算法
Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接超时 ...
随机推荐
- unity3D与网页的交互
由于项目需要,要求用unity来展示三维场景,并在三维中能够方便的查询数据库等.一开始尝试在unity中直接连接数据库,当时连的xml,然而每次发布成网页后都会出现路径找不到等问题,所以迫不得已采用了 ...
- 关于promise
后来发现promise是解决异步的一个链式调用的好的方法,避免了所谓的回调的监狱, 它有三个状态,未作为,已经完成和已经失败,起始是未作为,然后有了动作总会有个结果, 分成resolve,已经顺利ok ...
- WisDom.Net 框架设计(二) 服务总线
WisDom.Net 框架设计--服务总线 1.Soa 简介 soa 就是面向服务的体系结构 是一个组件模型,不同的组件之间通过定义良好的接口联系起来.就像盖房子一块砖头一块砖头的砌墙,一片一 ...
- CentOS安装memcached及配置php的memcache扩展
遇到的问题: 这个问题主要是linux服务器安装memcached服务后,phpinfo信息没有memcache扩展,所以主要是给php安装memcache扩展,教程中是安装memcache扩展,我认 ...
- C#中byte[]与string的转换
1. System.Text.UnicodeEncoding converter = new System.Text.UnicodeEncoding(); byte[] i ...
- one way WebService
WSDL支持4种消息交换方式: 1)单向(One-way):服务端接收消息: 2)请求响应(Request-response):服务端点接收请求消息,然后发送响应消息: 3)要求应答(So ...
- Kettle的集群排序 2——(基于Windows)
5.使用kettle集群模式对相关的数据进行排序 既然,基于Carte服务程序所搭建的集群已经在Spoon中设定好了, 可以首先,先来启动四个节点: "以管理员身份运行"打开 四个 ...
- TOM大师脚本01-查找未建索引的外键
[oracle@Oracle11g 2016]$ cat 022201.sql column columns format a30 word_wrappedcolumn tablename forma ...
- js 中读取JSON的方法探讨
方法一:函数构造定义法返回 var strJSON = "{name:'json name'}"; //得到的JSONvar obj = new Function("r ...
- css布局小技巧 2016.03.06
偶遇一个可爱的css布局学习网站,立刻学起来哟- max-width: 当页面左右宽度缩小时,为了避免出现左右滚动条的糟糕体验,就可以用到max-width啦!页面比宽度小时,会自动缩小哦- max- ...