功能:
主线程根据负载工作线程负载均衡算法,每隔一秒钟向特定的工作线程发送一条字符串信息,工作线程简单的把字符串信息打开出来。
 
Makefile
 
  1. eventtest : eventtest.c
  2. gcc -Wall -g -levent -lpthread -o eventtest eventtest.c
  3. .PHONY : clean
  4. clean :
  5. rm eventtest -f
 
eventtest.c
 
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <pthread.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <event.h>
  8. typedef struct {
  9. pthread_t tid;
  10. struct event_base *base;
  11. struct event event;
  12. int read_fd;
  13. int write_fd;
  14. }LIBEVENT_THREAD;
  15. typedef struct {
  16. pthread_t tid;
  17. struct event_base *base;
  18. }DISPATCHER_THREAD;
  19. const int thread_num = 10;
  20. LIBEVENT_THREAD *threads;
  21. DISPATCHER_THREAD dispatcher_thread;
  22. int last_thread = 0;
  23. static void
  24. thread_libevent_process(int fd, short which, void *arg)
  25. {
  26. int ret;
  27. char buf[128];
  28. LIBEVENT_THREAD *me = arg;
  29. if (fd != me->read_fd) {
  30. printf("thread_libevent_process error : fd != me->read_fd\n");
  31. exit(1);
  32. }
  33. ret = read(fd, buf, 128);
  34. if (ret > 0) {
  35. buf[ret] = '\0';
  36. printf("thread %llu receive message : %s\n", (unsigned long long)me->tid, buf);
  37. }
  38. return;
  39. }
  40. static void *
  41. worker_thread(void *arg)
  42. {
  43. LIBEVENT_THREAD *me = arg;
  44. me->tid = pthread_self();
  45. event_base_loop(me->base, 0);
  46. return NULL;
  47. }
  48. static void
  49. timeout_cb(int fd, short event, void *arg)
  50. {
  51. struct timeval tv;
  52. struct event *timeout = arg;
  53. int tid = (last_thread + 1) % thread_num;        //memcached中线程负载均衡算法
  54. LIBEVENT_THREAD *thread = threads + tid;
  55. last_thread = tid;
  56. write(thread->write_fd, "Hello world!", sizeof("Hello world!") - 1);
  57. evutil_timerclear(&tv);
  58. tv.tv_sec = 1;
  59. event_add(timeout, &tv);
  60. }
  61. int
  62. main (int argc, char *argv[])
  63. {
  64. int ret;
  65. int i;
  66. int fd[2];
  67. struct event timeout;
  68. struct timeval tv;
  69. pthread_t tid;
  70. dispatcher_thread.base = event_init();
  71. if (dispatcher_thread.base == NULL) {
  72. perror("event_init( base )");
  73. return 1;
  74. }
  75. dispatcher_thread.tid = pthread_self();
  76. threads = calloc(thread_num, sizeof(LIBEVENT_THREAD));
  77. if (threads == NULL) {
  78. perror("calloc");
  79. return 1;
  80. }
  81. for (i = 0; i < thread_num; i++) {
  82. ret = socketpair(AF_LOCAL, SOCK_STREAM, 0, fd);
  83. if (ret == -1) {
  84. perror("socketpair()");
  85. return 1;
  86. }
  87. threads[i].read_fd = fd[1];
  88. threads[i].write_fd = fd[0];
  89. threads[i].base = event_init();
  90. if (threads[i].base == NULL) {
  91. perror("event_init()");
  92. return 1;
  93. }
  94. event_set(&threads[i].event, threads[i].read_fd, EV_READ | EV_PERSIST, thread_libevent_process, &threads[i]);
  95. event_base_set(threads[i].base, &threads[i].event);
  96. if (event_add(&threads[i].event, 0) == -1) {
  97. perror("event_add()");
  98. return 1;
  99. }
  100. }
  101. for (i = 0; i < thread_num; i++) {
  102. pthread_create(&tid, NULL, worker_thread, &threads[i]);
  103. }
  104. evtimer_set(&timeout, timeout_cb, &timeout);
  105. event_base_set(dispatcher_thread.base, &timeout);
  106. evutil_timerclear(&tv);
  107. tv.tv_sec = 1;
  108. event_add(&timeout, &tv);
  109. event_base_loop(dispatcher_thread.base, 0);
  110. return 0;
  111. }

libevent带负载均衡的多线程使用示例的更多相关文章

  1. Ribbon自带负载均衡策略比较

    Ribbon自带负载均衡策略比较 策略名 策略声明 策略描述 实现说明 BestAvailableRule public class BestAvailableRule extends ClientC ...

  2. Ribbon自带负载均衡策略

    IRule这是所有负载均衡策略的父接口,里边的核心方法就是choose方法,用来选择一个服务实例. AbstractLoadBalancerRuleAbstractLoadBalancerRule是一 ...

  3. HAProxy(二):HAProxy的ACL规则实现智能负载均衡详解与示例

    一.HAProxy的ACL的功能 ACL(Access Control List)访问控制列表,HAProxy中的ACL的匹配条件和控制条件有许多种,功能很强大,可以通过源地址.源端口.目标地址.目标 ...

  4. apache、mod_jk负载均衡与tomcat集群

    最近需要搭建apache和tomcat的集群,实现静态网站直接通过apache访问,动态网站转交给tomcat处理,实现负载均衡和tomcat集群配置. apache安装 wget http://ap ...

  5. nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理

    Nginx除了可以用作web服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案.nginx可以用轮询.IP哈希.URL哈希等方式调度后端服务器,同时也能提供健康检查功能 ...

  6. 客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍

    Netflix:['netfliːks] ribbon:英[ˈrɪbən]美[ˈrɪbən]n. 带; 绶带; (打印机的) 色带; 带状物;v. 把…撕成条带; 用缎带装饰; 形成带状;     L ...

  7. Dubbo学习(二) Dubbo 集群容错模式-负载均衡模式

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

  8. (转)nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理

    Nginx除了可以用作web服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案.nginx可以用轮询.IP哈希.URL哈希等方式调度后端服务器,同时也能提供健康检查功能 ...

  9. spring-cloud-starter-ribbon提供客户端的软件负载均衡算法

    Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接超时 ...

随机推荐

  1. mysql 锁 实验

    CREATE TABLE `kk` ( `a` ) NOT NULL, `b` ) NOT NULL, `c` ) NOT NULL, PRIMARY KEY (`a`), UNIQUE KEY `b ...

  2. Apple-Watch开发2 APPIcon设置

    网址:http://makeappicon.com/ 直接放置到相应的文件即可 (these are all in pixels) 48 x 48 55 x 55 58 x 58 80 x 80 87 ...

  3. CGLIB学习笔记

    0 概述 CGLIB基于ASM实现.提供比反射更为强大的动态特性.使用CGLIB可以非常方便的实现的动态代理. 0.1 CGLIB包结构 net.sf.cglib.core    底层字节码处理类. ...

  4. HTML5 <Audio>标签API整理(一)

    简单实例: <audio id="myAudio"></audio> <script> var myAudio = document.getEl ...

  5. android listview 替代品recyclerview详解

    安卓v7支持包下的ListView替代品————RecyclerView   RecyclerView这个控件也出来很久了,相信大家也学习的差不多了,如果还没学习的,或许我可以带领大家体验一把这个艺术 ...

  6. maven项目下tomcat直接启动不了(LifecycleException)。报错如下截图

    经查,tomcat项目下的lib中没有jar包,发布的时候没有将jar包发布上去.这个问题在我的博客中以前遇到过.如何将maven的jar发布到项目中,我的博客里面有记载

  7. 【转】 UIView如何管理它的子视图

    原文:http://my.oschina.net/u/1984662/blog/293690 目录[-] Core Animation基础 改变视图的层 动画支持 视图坐标系统 边框.边界.和中心的关 ...

  8. iOS 集成支付宝遇到的问题(续)

    调起支付宝进行支付时提示private key is null ,碰到这个问题有两种解决方案 第一种. 将私钥转成PKCS8替换一下原私钥即可 1.生成私钥pem,  执行命令openssl genr ...

  9. 在万网虚拟主机上部署MVC5

    参考 要想部署mvc,需要把一些mvc用到的全局程序集改为本地部署,通过N次试验,终于搞定. 特写个备忘录,免得以后忘了. 首先更改web.config,在里面加上 <system.web> ...

  10. String 方法

    import java.lang.*; /** * 1.查找"asdfjvjadsffvaadfkfasaffdsasdffadsafafsafdadsfaafd" * 该字符串中 ...