1
lookhi 2012-12-14 23:36:04 +08:00 2
换Go了
|
3
BigZ 2012-12-16 11:20:19 +08:00
当做erlang的python,有点gevent的意思
|
5
pythonee OP @myrual
其实我就想知道性能会更好的原因,性能也会更差的! 目前了解到的是,协程可以理解为异步的封装,那么异步的单独使用是不会利用到多核的,协程的单独使用也不会提高性能,但是这两者的结合,就会充分发挥cpu的性能,多协程间的切换成本低,封装异步使得代码可读性高,目前了解就这么多,欢迎讨论 |
7
myrual 2012-12-16 15:32:25 +08:00
@pythonee 操作系统级别的线程切换是需要copy大量的数据,导致cpu的很多时间用在切换进和切换出上,而用户级别的协程切换与操作系统无关,个人猜测任务切换需要的数据量相对少很多,同时维护任务的上下文需要的数据量也很小,所以并发任务数量可以很多。
举个例子: goroutine和gevent都不是抢占式任务调度,而是当发生系统调用的时候进行切换。 个人猜测为了更加经济的支持多任务兵法,goroutine和gevent的设计是有意选择非抢占式调度。 以上均为个人猜测。 总结一下就是:以前至少用1M内存才能支撑完成一个任务,现在用1k来支撑,任务切换以前要用1秒,现在0.1秒。 所以性能提升了。 但是如果某个任务就是非常耗时,非常耗内存,那么其实没区别。 所以性能提升的另一个前提是, 大量的并发中只有少部分真在工作,剩下的大部分都在休息。 否则性能无法提升 |
8
pythonee OP @myrual 用户级别线程轻量,轻轻松松就可以创建1w个,这真不是提升性能的关键,如果每个tasklet里面的操作都是阻塞的,那么很可能就更差了,因为这些tasklet不是真并发,他们这时候变成了串行,让他们切换的关键是异步IO,一个tasklet不至于阻塞别的tasklet,而这个切换成本很低很低
第二个前提提醒了我,但是这不是多线程,多钎程所能解决的了,这时候真的就是使用更好的机器,换计算模型的时候了 |
9
myrual 2012-12-16 17:39:31 +08:00
@pythonee 你说的对,用户级别的线程能发挥作用的场景是有若干限制条件的。
1. 一个线程(一组线程)对应一个单独的服务对象,不同的服务对象之间不存在依赖关系。 2. 大多数时候线程处于休息状态。 3. 线程工作的时候负载不大,工作时间很短。 4. 服务器同时持有大量不活跃的服务对象的负担很小。 |
10
shymonk 2017-04-05 17:54:06 +08:00 1
写了一篇关于 stackless 的文章,可以参考。
http://shymonk.com/posts/2016/06/stackless-python-tan-mi/ |