初学python 协程(无锁生产者&消费者)

原文地址:http://www.cnblogs.com/Bozh/archive/2012/05/31/2528302.html

引言:前几天看了一点InfoQ上大神们很多的总结,服务编程范式以这样的方式进化多进程--->多线程--->非阻塞--->协程。

说说协程,找了一些关于GreenLet的资料,协程也称作微线程,是比线程还小的一种执行体。

线程确实执行体就是一个函数,在用户空间看来,但是在内核中线程也是一个进程,LWP所谓的轻量级进程,线程也存在自己的上下文运行环境。

协程不同于线程的是,线程是抢占式的调度,而协程是协同式的调度,也就是说,协程需要自己做调度。

看看一个简单的消费者&生产者模型的python代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def coroutine(func):
     def ret():
         f = func()
         f. next ()
         return f
     return ret
 
 
 
@coroutine
def consumer():
     print "Wait to getting a task"
     while 1 :
         n = ( yield )
         print "Got %s" ,n
 
 
 
import time
def producer():
     c = consumer()
     while 1 :
         time.sleep( 1 )
         print "Send a task to consumer"
         c.send( "task" )
 
if __name__ = = "__main__" :
     producer()

 

这里协程的调度是通过 send() 调用来传递任务,就是说,在producer执行期间,consumer是阻塞在 yield 表达式上。

每一次send()都会传递值给相应的任务给consumer.

总结:可以看出来,协程确实是一种轻量级的线程,调度策略取决于什么时候发送"消息"。关于其具体的实现还没有看过源码。不能妄加评论

比较好的开源协程库 eventlet | greenlet 等


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
协程是一种轻量级的线程,它可以在一个线程中实现多个任务的并发执行。协程的优势在于避免了线程切换的开销,同时也能够避免线程间的竞争和死锁问题。下面是针对协程初学者的浅入深的学习建议: 1. 了解基础概念 在开始学习协程之前,需要先了解一些基础概念,如线程、进程、同步、异步、阻塞、非阻塞等。这些概念是协程学习的基础,可以通过阅读相关的教材或者网络资源来学习。 2. 学习协程的语法 协程的语法相对于线程和进程来说比较简单,因此学习起来也比较容易。需要学习的语法包括如何创建协程、如何启动协程、如何使用协程间的通信等。 3. 练习实例 学习协程最好的方法是通过实践来掌握,可以通过编写一些简单的协程程序来进行实践。例如,可以编写一个简单的生产者消费者模型,或者一个简单的协程调度程序。 4. 学习协程Python中有多个协程库可供选择,如asyncio、gevent、greenlet等。可以通过学习这些库,了解协程的更高级别的应用。其中,asyncio是Python标准库中的协程库,可以通过官方文档来学习。 5. 学习协程的应用 协程在网络编程、并发编程等领域有着广泛的应用。可以通过学习一些协程的应用场景,如异步IO、Web应用开发等,来了解协程的实际应用。 总之,协程是一种非常有用的编程技术,可以提高程序的并发性能,适合处理大量IO密集型的任务。初学者可以通过以上的建议来学习协程,从浅入深地掌握协程的基础知识和实践技巧。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值