“多线程IO”和“单线程异步IO”的对比

顺手写了个程序对比了一下多线程IO和单线程异步IO的性能差异。需要说明的是,Linux上目前的异步IO是由用户态线程模拟的。目前内核原生的AIO和glibc中的异步IO都有缺陷,libeio目前感觉比较好(因为nodejs在用)。单线程异步IO指的是主线程中控制IO的代码全部都是在主线程中执行的,libeio内部使用的线程对外来说完全不可感知。单线程异步IO的好处就是主流程中的控制代码完全处于单线程环境,可以完全不用考虑锁的问题。

应用场景客户端启动20个线程同时从服务端求数据。服务端从磁盘出文件回给客户端。服务端有两种实现1、使用多线程每个线程服务一个用户。2、使用单线程和异步IO来服务多个用户。

测试时服务端的处理器为单核600MHZ的ArmV6(RaspberryPi),客户端为2.5 GHz Intel Core i5(2013版 Mac mini),因此客户端不会成为性瓶可以体现出服务端的差异。两台机器用100M网线直连。

20个线程下载700KB的文件:(测4次录每次成绩,数据为所花费的时间,越少越好)

多线程
183393
183505
183792
182878

异步IO
198165
191537
196565
193653

20个线程下载40K文件

多线程
12434
13099
12773
12958

异步IO
15293
15073
15974
15631

两种方案的优缺点对比
1、性上传统的多线程方案占有优势。不过测程序中多线程中完全没有使用锁,现实中由于的锁的限制多线程的性将大打折扣。
2、单线程异步IO程序中,由于控制代码在单线程环境中运行,可以完全无锁。
3、单线程异步IO程序中同时服务20个用户只使用了3个线程(libeio使用线程模拟异步IO,当前Linux上异步IO没有更好的决方案),多线程版本的程序使用了21个线程(包括主线程)。由于线程多,因此多线程版本的内存占用比libeio版本了很多。
4、libieo版本的流程没有多线程版本的直观。

总结
单线程异步IO的主流程代码可以完全无锁,这个是单线程异步IO的最大优势。在性能损失不多的情况下(和完全无锁的多线程方案对比,现实中完全无锁的多线程环境几乎不存在),很值得考虑。唯一需要考虑的,单线程异步IO可能对多核CPU的利用不如传统的多线程充分。
另外,还可以扩展一下,在编写复杂应用时,除了IO等阻塞操作,CPU密集的操作也可以拿出来到单独的线程中执行,尽量把耗时不多的逻辑部分留在单线程中,由于运行在单线程环境,这样很大程度上简化逻辑部分的编写。


转自:http://www.grati.org/?p=684

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的异步函数和多线程都是用于处理并发执行的机制,但它们有以下几个区别: 1. 编程模型:异步函数使用的是异步编程模型,而多线程使用的是多线程编程模型。异步函数通过事件循环和协程来实现非阻塞的并发执行,而多线程则通过同时运行多个线程来实现并发执行。 2. 并发性:异步函数在单线程下实现并发执行,通过切换任务来实现非阻塞的并发。而多线程可以使用多个线程在多个CPU核心上同时执行,实现真正的并行执行。 3. 资源消耗:由于异步函数在单线程下运行,不需要额外的线程开销,因此在资源消耗上比多线程更加轻量级。而多线程需要创建和管理多个线程,会占用更多的系统资源。 4. 线程安全:由于异步函数在单线程下运行,不涉及共享资源的读写,因此天然具备线程安全性。而多线程需要考虑共享资源的同步和互斥访问,需要使用锁等同步机制来保证线程安全。 5. 编程复杂性:相对于多线程异步函数有更简洁的编程模型,通过async/await关键字可以直观地编写异步代码。而多线程编程需要考虑线程之间的同步、数据共享等问题,编程复杂性相对较高。 总的来说,异步函数适用于IO密集型的并发任务,能够充分利用单线程的资源,提高程序的效率。而多线程适用于CPU密集型的并发任务,能够利用多个CPU核心进行真正的并行计算。选择使用异步函数还是多线程取决于具体的应用场景和需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值