异步/ IO和并行

时间:2018-09-16 17:24:01

标签: python python-3.5 python-multiprocessing python-asyncio aiohttp

我正在使用aiohttp创建一个Async / IO网络服务器。但是,据我了解,Async / IO意味着服务器只能在一个处理核心上运行。另一方面,像uwsgi这样的常规同步服务器可以通过真正的并行线程和进程充分利用计算机的计算资源。那么,与并行处理相比, 更少的异步/ IO为什么又是新潮流呢?像aiohttp这样的异步服务器可以被多进程处理吗?

2 个答案:

答案 0 :(得分:3)

  

那么,如果异步/ IO并行性不及多处理,那么为什么它又是新的和流行的?

两者解决了不同的问题。 Asyncio允许编写异步代码,而无需使用“回调地狱”。 await允许使用具有自动挂起和任务切换功能的循环,if,try / except等构造。这样可以为大量连接提供服务,而无需为每个连接生成线程,但是具有可维护的代码,使代码外观看起来像是为阻止连接而编写的。因此,异步只会帮助那些唯一瓶颈正在等待外部事件(例如网络IO和超时)的代码。

另一方面,

多处理与并行执行 CPU约束代码(例如科学计算)有关。由于the GIL导致OS线程无济于事,因此多处理会产生单独的OS进程并将工作分配给它们。这是以无法轻松共享数据的过程为代价的-所有通信都是通过管道进行串行化或使用专用的proxies完成的。

从理论上讲,多线程异步风格的框架是可能的-例如Rust的tokio就是这样-但由于GIL阻止使用多个内核,因此在Python中不起作用。将asyncio与多处理相结合也不大可能实现,因为asyncio的实现和使用asyncio的代码都在很大程度上取决于共享状态。

答案 1 :(得分:1)

独角兽can帮助您:

gunicorn module:app --bind 0.0.0.0:8080 --worker-class aiohttp.GunicornWebWorker --workers 4