libevent 多執行緒例子
主執行緒根據負載工作執行緒負載均衡演算法,每隔一秒鐘向特定的工作執行緒傳送一條字串資訊,工作執行緒簡單的把字串資訊打開出來。
Makefile
eventtest : eventtest.c
gcc -Wall -g -levent -lpthread -o eventtest eventtest.c
.PHONY : clean
clean :
rm eventtest -f
code:
#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 多執行緒例子
主執行緒根據負載工作執行緒負載均衡演算法,每隔一秒鐘向特定的工作執行緒傳送一條字串資訊,工作執行緒簡單的把字串資訊打開出來。 Makefile eventtest : eventtest.c gcc -Wall -g -levent -lpthread -o
windows下Libevent +多執行緒(負載均衡分配法) 之檔案傳輸
一、先說一下服務端的流程: 1、主執行緒負責監聽客戶端的連線; 2、當有客戶端連線時,主執行緒通過管道向相應的子執行緒傳送監聽套接字描述符,子執行緒通過負載均衡法選擇出來; 3、當主執行緒傳送監聽描述符時,子執行緒的讀管道回撥函式會被回撥; 4、子執行緒為收到的監聽描述符設定讀取
Java學習——多執行緒例子:李四王五
package cys; public class Example9_2 { public static void main(String[] args) { // TODO Auto-generated method stub P
windows下 Libevent +多執行緒 實現檔案傳輸
1、模式:來一個客戶端連線進來,服務端就開啟一個處理執行緒。 2、缺點:對大量的客戶端情況不適用。大量客戶端的情況需要加入執行緒管理機制。 // LibeventTest.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #incl
Python3 多執行緒例子
import threading, zipfile class AsyncZip(threading.Thread): def __init__(self, infile, outfile): threading.Thread.__init__(self) se
libevent多執行緒伺服器
伺服器端程式碼: #include "lib_net.h" #include "lib_thread.h" #include "lib_public.h" #include<event.h> #include<event2/util.h> #
multi-reactor伺服器模型的C++封裝類(libevent+多執行緒實現)
最近在看memcached的原始碼,覺得它那種libevent+多執行緒的伺服器模型(multi-reactor)真的很不錯,我將這個模型封裝成一個C++類,根據我的簡單測試,這個模型的效率真的很不錯,歡迎大家試用。 這個類的使用方法很簡單(缺點是不太靈活),只
使用libevent多執行緒驗證Linux上的伺服器"驚群"現象
什麼是驚群現象? 驚群(thundering herd)是指,只有一個子程序能獲得連線,但所有N個子程序卻都被喚醒了,這種情況將使效能受損。 舉一個很簡單的例子,當你往一群鴿子中間扔一塊食物,雖然最終只有一個鴿子搶到食物,但所有鴿子都會被驚動來爭奪,沒有搶到食物的鴿子只好回
多執行緒例子:yield
Java程式碼 public class Test { public static void main(String[] args) { Thread t1 = new MyThread1(); Thread
libevent多執行緒
功能: 主執行緒同時監聽定時器事件和IO事件,工作執行緒簡單的監聽IO事件。 主執行緒每隔一秒種向工作執行緒傳送一條字串資訊 工作執行緒顯示該資訊並回顯給主執行緒 該示例演示了主執行緒如何同時監聽多個事件。 Makefile eventtest : eventtest.c gcc -Wall -
Python多執行緒小例子
Python多執行緒小例子 1、在主執行緒中建立子執行緒 下面的程式碼一共建立了三個執行緒:主執行緒、coding 執行緒和music 執行緒,最後使用thread_list 裝載執行緒
Python 多執行緒工具包 threading 的超簡單例子
筆者初學 Python,在程式設計中,遇到了多執行緒的問題,即需要一個程式中的幾部分同時執行。 例如:給一個後臺程式寫一個“心跳程序”,定時輸出訊號,以確認程式正常執行。 在網上搜索了下發現有不少帖子,但總感覺帖子中舉的例子不夠簡單和直觀,遂決定寫個自己覺得夠簡單直觀的例子。程式碼如
[進階]-多執行緒、多程序、非同步IO實用例子
在編寫爬蟲時,效能的消耗主要在IO請求中,當單程序單執行緒模式下請求URL時必然會引起等待,從而使得請求整體變慢。以下程式碼預設執行環境為python3。 目錄 一、多執行緒、多程序 1.同步執行 2.多執行緒執行 3.多執行緒+回撥函式執行 4.多程序執行 5.多程
Jsoup簡單例子2.0——多執行緒爬取網頁內的郵箱
上一篇文章講了利用Jsoup爬取貼吧帖子裡的郵箱,雖然爬取成功了,但我對效率有所追求。10頁的帖子爬取了兩百多個郵箱,最快用時8秒,一般需要9秒。在思考了一下怎麼提升效率後,決定採用多執行緒的方式爬取網頁內的郵箱。廢話不多說,直接上程式碼。 引入Jsoup的jar包此處省略,沒有的可以檢視上篇文
windows下Libevent的多執行緒封裝(以檔案傳輸為例)
1、主執行緒負責監聽,子執行緒負責響應連線,同時每個子執行緒增加了連結串列來管理連線進來的客戶端,將上一節中的記憶體管理類也封裝進去。總體框架是不變的。 2、封裝類的實現: #pragma once #include "winsock2.h" #include "event2/liste
Java多執行緒開發——一個簡單的數字加減小例子
範例: 兩個執行緒實現加法,兩個執行緒實現減法 class Resource { private int num = 0; private boolean flag = true; //flag = true 表示可以進行加法操作,不能進行減法操作 //flag = fa
libevent原始碼分析--鎖和多執行緒
寫在前面: 這個原始碼是分析libevent-2.0.20-stable, 並非最新版本的libevent,作者並沒有全看原始碼,在這裡會推薦以下參考的一些網站,也歡迎大家在不足的地方提出來進行討論。 鎖 libevent的內部實現不需要多執行緒,
Java多執行緒----執行緒的同步,鎖和死鎖,問題以及解決方法(例子說明)
一、執行緒併發同步概念 執行緒同步其核心就在於一個“同”。所謂“同”就是協同、協助、配合,“同步”就是協同步調昨,也就是按照預定的先後順序進行執行,即“你先,我等, 你做完,我再做”。 執行緒同步,就是當執行緒發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不會返回,其他
java 多執行緒 同步 觀察者 併發集合的一個例子
//第一版 package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type; import org.springframework.boot.SpringApplication; import org.springfram
以生活的例子說明單執行緒和多執行緒
以生活例子說明單執行緒與多執行緒 轉載自:書圈 1. 程式設計的目標 在我看來單從程式的角度來看,一個好的程式的目標應該是效能與使用者體驗的平衡。當然一個程式是否能夠滿足使用者的需求暫且不談,這是業務層面的問題,我們僅僅討論程式本身。圍繞兩點來展開,效能與