协程是用户态内的,或者准确点说是线程内部的一种上下文切换技术,由于协程切换是在用户态下完成的,所以省去了线程切换时频繁出入内核态的资源开销,可以形成一种很高效的协作式并发技术。
这个简短的视频介绍了一些有关协程、并发之类的东西,很有意义。
Coroutines, event loops, and the history of Python generators
从里面学习到两种很好的协程的调度方式。把代码拿过来分享一下。
Coroutine trampoline
这种方式下的协程调度比较好理解,就是从一个初始状态开始,一条执行线索不断的在多个协程之间切换,就好像多个协程协作完成一项任务。
代码:
def co_tramp
继续阅读 »
tbox的协程实现,是stackfull模式的,需要指定独立堆栈和协程函数,目前暂时还不能像golang那样实现堆栈的动态增长,之后会对其进行支持。
目前提供下面一些功能特性:
1. 提供yield切换调度支持,这个是必须的哈
2. 提供suspend(挂起)/resume(恢复)协程接口,不同于yield的是,被suspend后,如果不显示调用resume恢复它,是永远不会被调度到的
3. 提供sleep等待接口支持
4. 提供io调度支持,支持socket等io等待(内部使用epoll, poll, kqueue, select, poll等接口调度)
5. 原生支持stream,socket,http等模块的协程支持,可
继续阅读 »
1,通常用到 perf sched record 收集系统相关的调度数据, 然后使用pert ached latency --sort max 来打印出收集到的信息,perf sched latency --sort max 展现的数据中各个column的含义如下:
继续阅读 »
简陋的FCFS实现
# -- coding: utf-8 --
class Pcb(object):
def init(self):
self.pid = None
self.ppid = None # id of parent
self.arrive_time = 0
self.need_time = 0
self.pprio = 0 #priority
继续阅读 »
RxJava 最大的两个特点:事件流操作,异步。
组合利用各种操作符,我们可以实现复杂的事件流处理需求,例如前文中提到的缓存{:target="_blank"}:根据一组 id,先从本地查询,本地缺失的部分再从服务器获取,再把两者合并起来返回,最后服务器获取的部分还要保存到本地。
继续阅读 »
事件调度器模块
记录下我们游戏里事件调度器模块, 用处, 代码结构。
我们用来注册一些事件到调度器, 调度器在做update的时候, 会检查容器内的事件, 事件的封装, 包含senderObj, receiveObj, id, delayFrameCount等等。 如果当前帧已经符合delayFrameCount的要求了, 就执行receiveObj.RecieveEvent()方法,将senderObj注册事件时的参数等, 带入RecieveEvent方法执行。
继续阅读 »
iOS GCD 基础名词解析:
串行与并行
串行和并行都是相对于队列而言的 -队列(负责调度任务)
串行队列:一个接一个的调度任务
并发队列:可以同时调度多个任务
同步与异步
串行与并行针对的是队列,而同步与异步,针对的则是线程。 最大的区别在于,同步线程要阻塞当前线程,必须要等待同步线程中的任务执行完,返回以后,才能继续执行下一任务;而异步线程则是不用等待。 仅凭这几句话还是很难理解,所以可以多准备几个案例,边分析边理解。
继续阅读 »
这里记录的是现在所在游戏的cpp代码里的, 关于事件调度和触发的源码分析.
EventDispatcher 是一个事件调度者
Event 事件基类
EventReceiver 所有需要接收世界的对象的基类, 它们都对EventReceiver做继承. 并重写RecieveEvent方法.
继续阅读 »
很高兴参加这次活动,之前我一直从事分布式计算;从硕士阶段就开始在做分布式资源的调度及优化这一块,当时是基于Globus做跨机群的资源调度。毕业时加入了百度,后来进入了Platform Computing公司;Platform Computing是一家有着20多年分布式经验的公司;2012年Platform Computing被IBM收购,现在做为IBM一个子部门继续从事分布式相关的工作。凭借我们在分布式方面非常丰富的经验,我们在与分布式相关的开源项目都有比较多的贡献,这次主要讲与Mesos, Kubernetes,Swarm相关,还有其它团队在做Spark相关的项目。我会介绍一下Kubernetes和Swarm与Mesos的集成;比
继续阅读 »
tbox内部的所有io操作都是原生支持协程的,可以在线程和协程间任意切换,内置基于轮询的io调度器(epoll, kqueue等,后续还会支持iocp).
我们在socket操作的时候,只需要像平常顺序编程那样操作就可以实现异步并发收发数据。
这里先给个简答的文件服务器的例子,可参考下,代码非常简单:
文件接收服务器
这个文件服务器的功能很简单,就是不停的接收连接,然后开新协程,进行文件传输。
通过协程,从原始socket写起,也只需要不到100行代码,就可以实现一个高并发的文件服务器。
此处用到了tb_socket_sendf直接对文件句柄操作,发送到socket,内部使用sendfile实现,不需要再上层开buffe
继续阅读 »