协程在什么情况下更快?
据我所知,是在多线程IO时。
协程是单线程异步,但是为什么在多线程IO时协程更快?
IO的操作对象(一个文件、一个变量、一块内存空间)可能只能处理一个线程的需求,但是有多个线程需要进行IO。
比如:用户线程很多,但同一时间只能有一个线程读写数据文件,多个线程同时读写会出问题。
那么这时就需要互斥(加锁),通过竞争锁来获取IO流的独占访问。
用户线程很多时,锁很难降级,锁竞争就会耗时,而在竞争期间,IO流只能闲着。
协程如何解决或改善这个问题?
协程中IO流要与一个线程绑定,不要在任何其它线程访问。
需要访问IO流的任务由一个调度器安排到这个线程中执行。
我把这个线程称为“生产者线程”,需要IO操作的线程叫“消费者线程”。
调度器怎么获取任务?获取到之后如何记录?
由消费者线程发送,可以用一个简单的队列记录。
理论上,出队比锁竞争效率高。
那不是入队时也还是要竞争?
是的。但不再是发生在获取访问权前才竞争,变成提前竞争了。
IO流就不会因为竞争而空闲,除非队是空的。
如果在任务IO之前需要进行计算,计算也被安排到生产者线程上运行,这时IO流不也是闲着吗?
这个问题要由开发者