.github/workflows example src test .gitignore .ocamlformat Makefile README.md dune dune-project ldl.opam Repository files navigation README LDL A toy event loop using poll and OCaml 5's effect handler
popkcel是“popkc的event loop”的意思,它支持epoll、kqueue和IOCP。相比于libuv,它的特点是轻量、简单,而且支持一种类似于协程的功能,使得你可以像写同步代码一样地写异步代码。它还支持一种简单的可靠UDP传输协议PSR(既Popkc's Simple Reliable UDP),可以利用UDP打洞的原理为内网机器之间提供类似TCP的可靠连接。
所有 Stream 都挂在一个链表下。当进入 eventloop 时,会遍历所有的 Stream,处理每一个 Streame 的 Event。 检测有无 Event 的 dyad_update() 是在干嘛? 本质就是用 select() 检测所有的 Stream 里的 socket 描述符。 当有Event 发生时,根据事件类型,将事件分发给 Stream 上的等待相应 Event 的 Listener,...
getCurrentMillisecs()对clock_gettime()的封装,获取到的struct timespec转换为millisecond。 这两个类的完整实现,我放到了Github上了:https://gist.github.com/baixiangcpp/b2199f1f1c7108f22f47d2ca617f6960。使用的时候,只需要在你的主循环里,把epoll_wait的超时参数设置为TimerManager::getRecentTimeout(),每次...
https://github.com/lzs123/CProxy.git 使用方法 代码语言:javascript 代码运行次数:0 运行 AI代码解释 bash build.sh // 启动服务端 {ProjectDir}/build/server/Server --proxy_port=8090 --work_thread_nums=4 (另一个终端) // 启动客户端 {ProjectDir}/build/client/Client --local_server=127.0.0.1...
这种模型通常被称作Event Loop。 Event Loop 在很多系统和框架里都有实现,比如 Node.js 的事件处理,比如Windows程序的消息循环,再比如 OSX/iOS 里的 RunLoop。实现这种模型的关键点在于:如何管理事件/消息,如何让线程在没有处理消息时休眠以避免资源占用、在有消息到来时立刻被唤醒。
选择epoll的优势很明显,能将定时功能完美的融入已有的event loop里,同时epoll有着天然的高并发的能力,millisecond级的精度也足够用。 获取当前时间 要实现一个定时器,有了定时函数,我们还需要选用一个获取时间的函数。同样地,这些函数我也整理了一下: time()精度太低,不合适。
ft_event.c add code 8年前 ft_event.h add code 8年前 ft_queue.h add queue 8年前 main.c add code 8年前 makefile add main.c 8年前 Loading... README MIT #ft_event ft_event 是一个使用C语言写的高效的eventloop #功能 time wheel ...
https://github.com/wangbojing/NtyCo/blob/master/nty_server_test.c while (1) { socklen_t len = sizeof(struct sockaddr_in); int cli_fd = nty_accept(fd, (struct sockaddr*)&remote, &len); nty_coroutine *read_co; nty_coroutine_create(&read_co, server_reader, &cli_fd);} ...
https://github.com/lzs123/CProxy.git 使用方法 bash build.sh // 启动服务端 {ProjectDir}/build/server/Server --proxy_port=8090 --work_thread_nums=4 (另一个终端) // 启动客户端 {ProjectDir}/build/client/Client --local_server=127.0.0.1:7777 --cproxy_server=127.0.0.1:8080 ...