
比如回射程序(客户端连接服务端,发送数据,服务端接受数据,返回给客户端)
服务端用协程和单进程 epoll 事件驱动模型对比,各有什么优势
疑惑 1 协程如果遇到未准备好的 io 会 yield, 谁来发现这个事件到来了呢,这个不像 epoll 可以返回可读可写的描述符,怎么 resume 这个协程,让它继续执行呢
疑惑 2 协程不能利用多核,单进程 epoll 也不能利用多核啊,是这样吗
1 simple2025 2018-02-23 00:24:32 +08:00 python tornado 的协程就是用 epoll 来搞的, |
2 lianghh 2018-02-23 00:37:19 +08:00 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 好像不是同一个东西,一个是 IO 模型,一个是类似线程间的调度吧 |
6 thomaswang OP |
7 eslizn 2018-02-24 14:07:13 +08:00 @thomaswang 协程本质上并是串行的,所以在协程中是“线程安全”的。我猜测你说的是指跨线程、进程的资源共享、竞争场景,那么可以配合共享内存等方式来解决 |