Goroutines vs asyncio任务+用于CPU绑定调用的线程池

max*_*max 2 concurrency go coroutine python-3.x python-asyncio

goroutine大致相当于python的asyncio任务,还有一个额外的功能,即任何CPU绑定的任务都被路由到一个ThreadPoolExecutor而不是被添加到事件循环中(当然,假设我们使用没有GIL的python解释器)?

我失踪的两种方法之间有什么实质性的区别吗?当然,除了并发性是Go的一个组成部分所带来的效率和代码清晰度之外.

max*_*max 7

我想我知道答案的一部分.我试图总结一下我对asyncio任务和goroutines 之间的重要性差异的理解:

1)与under不同asyncio,人们很少需要担心他们的goroutine会阻塞太长时间.OTOH,跨goroutine的内存共享类似于跨线程而不是asyncio任务的内存共享,因为goroutine执行顺序保证要弱得多(即使硬件只有一个内核).

asyncio只能在明确的上下文切换await,yield以及某些事件循环的方法,而Go运行时可以切换上更为微妙的触发器(如某些函数调用).所以asyncio是完全合作的,而goroutines只是大部分合作(并且路线图表明它们将随着时间变得更加合作).

一个非常紧凑的循环(例如使用数值计算)仍然可以阻止Go运行时(以及它正在运行的线程).如果它发生,它将比python中的影响更小 - 除非它发生在多个线程中.

2)Goroutines对并行计算有现成的支持,这需要更复杂的方法asyncio.

Go运行时可以并行运行线程(如果有多个核可用),所以它有点类似于asyncio在无GIL的python运行时下在线程池中运行多个事件循环,前面有一个语言感知的负载均衡器.

3)Go运行时将自动处理单独线程中的阻塞系统调用; 这需要在asyncio(例如,使用 run_in_executor)下明确地完成.

也就是说,就内存成本而言,goroutines非常类似于asyncio任务而非线程.