silly 是一个以 Lua 语言开发为主的高并发服务器框架,也是一个轻量的、极简的服务器程序框架。
silly 底层采用 C 和 Lua 语言混合开发,而上层业务逻辑开发则以 Lua 语言开发为主。
silly 工作于传统的单进程单线程模型。主要解决 socket 连接管理及异步调用带来的麻烦(callback hell)。socket 连接管理主要采用 C 代码编写,Lua coroutine 则被用来避免异步调用带来的麻烦。
silly内部有3个线程协同工作,之所以依然说他是单进程单线程工作模型是因为这3个线程之间不共享任何变量,与3个独立的进程没有任何区别。这三个线程分别管理worker, socket, timer.
worker线程工作在lua虚拟机之上,主要负责处理socket/timer产生的事件,因此所有的逻辑代码都是通过worker线程执行的。worker模块在接收到事件后会立即将其转换到lua层,然后再调用逻辑代码进行处理。
socket线程在epoll/kevent上的基础上做了一层薄薄的封装,主要用于高效的将socket数据、关闭、连接等事件发送到worker线程进行处理。默认socket最大只能管理65535个连接,可以通过silly_socket.c文件中的宏MAX_SOCKET_COUNT来控制最大socket连接数的限制。另外,socket对epoll/kevent进行了封装,由socket_poll.h统一管理。只要符合socket_poll.h对接口的定义,可以轻松为silly换成任何需要的socket IO模型。
timer线程是一个高分辨率低精度定时器,其默认分辨率为10ms,可以通过修改silly_timer.c中的宏RESOLUTION来控制timer中的分辨率,但是最低不得低于1ms.
silly提了一部分特性的测试代码,运行./silly test/test会自动运行所有模块的测试。这些代码都极其简单并且都可以独立运行, 简单修改一个启动配置文件即可单独运行。
因此运行一下测试代码应该是一个不错的开始。
对一个长度为N的整数序列,交换数据X和Y的代价是两数之和X+Y,通过两两交换数据使得该序列呈增序次序排列,求最小代价。 示例:{3 2 1}=4, {8 1 2 4}=17,{1 8 9 7 6}=41,{8 4 5 3 2 7}=34 前两个示例{3 2 1}和{8 1 2 4},似乎给人贪心策略的感觉:每次选择代价最小的一对交换,使得至少一个数字能归位。但是后两个示例对贪心策略已经
The Central Company has an office with a sophisticated security system. There are 106 employees, numbered from 1 to 106. The security system logs entrances and departures. The entrance of the i-th emp
链接 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3457 题解 这题是贪心… 先建图找到所有的环 对于每个环,显然我搞 n − 1 n-1 n−1次就能把它排好,一种很显然的贪心就是每次把最小数字的前驱和最小数字交换,因为每个数字肯定都要有一个来和它
最近一个月都在重构silly, 包括其工作模式以及一些扩展库的实现基本上都被重写了。 其实coding的时间并没有想象中的那么长,只是在重构过程中碰到很多取舍情况,大部分时间都耗费在了纠结的时间上。 当初实现silly的初衷是首先满足类似gameserver这类业务模型的需求,然后尽可能多的兼顾其他类型的server。 然而以这两年的工作经验来看,master-worker模式由于多worker之
OpenCV/paintlib/CImg/FreeImage/CxImage/SILLY/Corona and OpenIL/Libavg paintlib http://www.paintlib.de/paintlib/ paintlib is a portable C++ class library for image loading, saving and manipulation
最新抽了点时间给Silly增加了了一个silly.patch模块,用于对热更新提供一些有限的支持。 热更新最麻烦之处莫过于“数据迁移”, 即怎么使新函数(要更新的函数)以“运行时数据”的状态运行。 其实http这类无状态协议是最为简单的,因为他们不需要“数据迁移”的过程。http的这种架构,使得所有的函数都是无副作用的,所有的数据在请求结束给出Response的同时数据就已经存入了数据库。当需要热
思路: 按照它的规则检测当前序列是否合法; 贪心思想,只要办公室没人了就结束这一天; 代码: #define IOS ios::sync_with_stdio(false) #include<bits/stdc++.h> using namespace std; #define pb(a) push_back(a) #define rp(i,n) for(int i=0;i<n;i++) #def
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4720 Problem Description Three wizards are doing a experiment. To avoid from bothering, a special magic is set around them. The magic forms a circle, whi
Codeforces Round #600 B. Silly Mistake 最近由郑同学介绍,参加了注册并参加了Codeforces的比赛,然后就爱上了它。大半夜的比赛真的给人一种兴奋的感觉,让我再一次感受到编程的乐趣。#600是我参加的第二次CF比赛,因为A题审题错误,耗费了大量的时间,然后不知道为什么B题是无法显示的在比赛时间内时。至于C题,也能做,不过还是太菜了,直接TLE了。为了提高自己
B. Silly Mistake(Codeforces Round #600 (Div. 2)) time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output Description The Central Company has an office
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #include <queue> #include <cmath> using namespace std; struct point{double x, y;}p[5];
主要内容:1.Disruptor介绍,2.Disruptor 的核心概念,3.demo1.Disruptor介绍 Disruptor是一个开源的Java框架,它被设计用于在生产者—消费者(producer-consumer problem,简称PCP)问题上获得尽量高的吞吐量(TPS)和尽量低的延迟。 从功能上来看,Disruptor 是实现了“队列”的功能,而且是一个有界队列。那么它的应用场景自然就是“生产者-消费者”模型的应用场合了。 其实Disruptor与其说是一个框架,不
不同于顺序服务器,并发服务器 就要能在一个时间为多个客户端提供服务。 例如,一个聊天服务器可能服务一个特定的客户端数小时 ──在停止为这个客户端服务之前服务器不能等待, 除非是在等待一下个客户端到来之前的间隙才能等待。 这需要在我们的流程图中做一个重要的更改: 我们将提供服务从 守护进程移至它自己的服务进程。 然而,因为每个子进程都继承所有打开的文件(套接字被像文件一样处理), 新进程不仅继承“a
本文向大家介绍Node.js 服务器端应用开发框架 -- Hapi.js,包括了Node.js 服务器端应用开发框架 -- Hapi.js的使用技巧和注意事项,需要的朋友参考一下 Hapi.js 是一个用来构建基于 Node.js 的应用和服务的富框架,使得开发者把重点放在便携可重用的应用逻辑而不是构建架构。内建输入验证、缓存、认证和其他 Web 应用开发常用的功能。 示例代码: 附上github
我有一个队列通道和一个带有轮询器的服务激活器,轮询器从该队列中读取数据。我希望配置为“我希望50个线程轮询该队列,每次轮询并返回消息时,在此线程上调用服务激活器指向的服务。” 该服务没有异步注释,但无状态,可以以并发方式安全运行。 下面的方法能做到吗?有没有其他首选的方法来实现这一点?
我有一个Cucumber测试套件,由Jenkins在一个服务器池上执行,该服务器池有时在服务器池中并发运行。 当服务器a上的测试运行更改了数据库存储的设置时,我遇到了竞争情况,这会导致服务器B上的测试运行失败,因为它正在寻找处于不同状态的设置 有没有办法将cucumber tests或Jenkins配置为在服务器B上运行场景,等待服务器a上运行的场景完成后再继续?
如何包含Eureka服务器 要在项目中包含Eureka服务器,请使用组org.springframework.cloud和工件id spring-cloud-starter-eureka-server的启动器。有关 使用当前的Spring Cloud发布列表设置构建系统的详细信息,请参阅Spring Cloud项目页面。 如何运行Eureka服务器 示例eureka服务器; @SpringBoot