比如回射程序(客户端连接服务端,发送数据,服务端接受数据,返回给客户端)
服务端用协程和单进程 epoll 事件驱动模型对比,各有什么优势
疑惑 1 协程如果遇到未准备好的 io 会 yield, 谁来发现这个事件到来了呢,这个不像 epoll 可以返回可读可写的描述符,怎么 resume 这个协程,让它继续执行呢
疑惑 2 协程不能利用多核,单进程 epoll 也不能利用多核啊,是这样吗
1
chenqh 2018-02-23 00:24:32 +08:00
python tornado 的协程就是用 epoll 来搞的,
|
2
lianghh 2018-02-23 00:37:19 +08:00 1
epoll 只是操作系统底层提供的一种多路复用机制,而协程则是更高一层的抽象。因为抽象出了协程这个概念,这样应用层的程序员就无须关心下层如何调度和实现的了,更具通用性。例如 goroutine 就可以使用到多核,你所谓的“协程不能利用多核”是指你所在的平台实现限制导致他不能使用多核,协程本身没有限制。协程 和 epoll 这两者不等同不能去比较,真正应该比较的我觉得是线程和协程。线程由系统调度导致多次陷入内核态,而协程由语言或者框架调度,很多切换都是在用户态完成,性能更加,这也是语言或者框架本身抽象协程的目的。
|
3
cheesea 2018-02-23 02:05:19 +08:00
协程可以通过 epoll 来切换呀。
epoll 只是当有事件发生时通知你,至于对事件的处理,你可以单进程也可以交给线程或者协程去做,这个不一定要单进程的。这篇文章可以参考下 http://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html,写的挺好。 |
4
eslizn 2018-02-23 03:03:29 +08:00
1.并不是谁来发现这个事件到来,而是由其他协程 yield 时来重试
2.是,不过可用通过配合多进程/多线程来解决这个问题,一个进程/线程来接收和响应请求,其他的分配给处理逻辑 |
5
Gathaly 2018-02-23 04:21:44 +08:00 1
好像不是同一个东西,一个是 IO 模型,一个是类似线程间的调度吧
|
6
thomaswang OP |
7
eslizn 2018-02-24 14:07:13 +08:00
@thomaswang 协程本质上并是串行的,所以在协程中是“线程安全”的。我猜测你说的是指跨线程、进程的资源共享、竞争场景,那么可以配合共享内存等方式来解决
|