python异步和多线程_Python性能篇之多进程与多线程的瓶颈,异步IO的到来

Python其实是通过generator来实现的,也就是生成器。

我们都知道,在generator中,我们可以通过for in 来循环迭代,也可以通过不断调用next()来拿到yield返回的值。其实,yield还有一个特性,它可以接收generator.send()发送出来的数据哦。

试想,我们把要执行IO操作的代码封装成generator,然后放入一个消息循环中执行,当执行完后,我们再执行send操作,是不是我们就可以再yield处接收执行的结果了呢?

我们通过协程来实现一个生产者消费者模型

示例代码如下:

def consumer(name):

r='';

while True:

n = yield r

if not n:

return

print('[Consumer:%s],I am consuming %s...' % (name,n))

r = '200 OK'

def produce(name,c):

c.send(None)

n = 0

while n < 5:

n = n + 1

print('[Produce:%s], I to producing %s...' % (name,n))

r = c.send(n)

print('[Produce:%s], Consumer return: %s' % (name,r))

c.close()

c = consumer('c1')

produce('p1',c)

结果输入为:

[Produce:p1], I to producing 1...

[Consumer:c1],I am consuming 1...

[Produce:p1], Consumer return: 200 OK

[Produce:p1], I to producing 2...

[Consumer:c1],I am consuming 2...

[Produce:p1], Consumer return: 200 OK

[Produce:p1], I to producing 3...

[Consumer:c1],I am consuming 3...

[Produce:p1], Consumer return: 200 OK

[Produce:p1], I to producing 4...

[Consumer:c1],I am consuming 4...

[Produce:p1], Consumer return: 200 OK

[Produce:p1], I to producing 5...

[Consumer:c1],I am consuming 5...

[Produce:p1], Consumer return: 200 OK

可以看到,生产者生产一个,然后通过send通知消费者进行消费。

代码分析:当我们执行c.send(None)的时候,触发生成器,此时r=‘’,当我们下一发送send时,执行yield后面的语句,然后发送下一次的r的值。

如此我们就只在一个线程中通过generator来实现了生产者消费者模型。

实际开发中如此写代码对于开发者来说是比较底层的,所以,python自然会给我们提供了编写协程代码的利器,我们将在后面章节中进行介绍。

你可能感兴趣的:(python异步和多线程)