关于异步编程一直有些疑惑

2012-09-26 12:08:41 +08:00
 zhangxiao
因为使用Twisted开始接触异步,自认为了解异步的原理了。从一开始就喜欢把异步和多线程编程作对比。感觉两者是对充分利用资源的两种不同途径。

可是我一直不太清晰的是,两者的异同。目前的感觉是,程序IO block较多的,用异步会很合适。自己多线程的代码写的很少,只是大学里用java的时候写过一点。后来工作一直用PHP以及Python,几乎没用到过多线程。

在这里希望大家能讨论讨论,以加深甚至纠正我对异步的认识。

谢谢。
2745 次点击
所在节点    问与答
2 条回复
phuslu
2012-09-26 12:23:57 +08:00
python 的异步的话, twisted 的异步还是略显复杂了, 建议看 tornado 里面的 IOLoop/IOStream 的实现.
然后再看看 gevent 挺好的.
oobleck
2012-09-26 15:24:04 +08:00
你说的多线程应该指的是同步多线程

同时处理多任务主要要解决的问题是怎么保存每个任务的上下文,比如同时下载多个文件,需要保存当前下载了哪些内容,接下来应该请求哪些内容

而同步多线程和是解决这个问题的两种不同方式

同步多线程采用的方法是保存整个调用栈,下次再轮到这个任务时再恢复调用栈来继续之前未完成的操作。就好比外星人把你大脑中的记忆保存下来,洗脑之后让你干别的事,完了之后再把你大脑复原到洗脑之前,对你来说,就好像中间的一些都没发生过一样

异步的方式是,代码中自己保存每个任务的上下文,只保存需要的上下文即可。好比你一件事做到一半要去做别的,就要先把这件事在小本儿上记下来,等做完别的回来看下小本儿,就知道刚才做到哪了,然后接着做。

所以可以明显看出来
同步多线程比异步多做了很多操作(本来只用在小本儿上记下来一点的,结果把你整个大脑的记忆都拷贝下来了),这样在同时进行的任务比较多的时候,时间都浪费在洗脑(线程切换)上了,所以异步效率更高

但同步多线程也不是没有优点,对于程序员来说不同手动记录上下文,操作系统会自动调度,写起来更方便(毕竟小本儿要自己手抄,洗脑是外星人帮你洗)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/48744

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX