我写了两段代码分别执行、
第一段代码:
由廖雪峰老师的程序改编使用了协程的思维
import time
def consumer():
r = ''
while True:
n = yield r
if not n:
return
q = 100
while q:
q -= 1
time.sleep(0.1)
print('Consumer runing %d...' % q)
print('[CONSUMER] Consuming %s...' % n)
r = '200 OK'
def produce(c):
next(c)
n = 0
while n < 5:
n = n + 1
q = 100
while q:
q -= 1
time.sleep(0.1)
print('Loading %d...' % q)
print('[PRODUCER] Producing %s...' % n)
r = c.send(n)
print('[PRODUCER] Consumer return: %s' % r)
c.close()
if __name__=='__main__':
start = time.time()
c = consumer()
produce(c)
print('Use time: %.3fs' % (time.time() - start))
第二段用来对比:
自己写了简单的函数调用方法
import time
def consumer(n):
r = ''
q = 100
while q:
q -= 1
time.sleep(0.1)
print('Consumer runing %d...' % q)
print('[CONSUMER] Consuming %s...' % n)
return '200 OK'
def produce():
n = 0
while n < 5:
n = n + 1
q = 100
while q:
q -= 1
time.sleep(0.1)
print('Loading %d...' % q)
print('[PRODUCER] Producing %s...' % n)
r = consumer(n)
print('[PRODUCER] Consumer return: %s' % r)
if __name__=='__main__':
start = time.time()
produce()
print('Use time: %.3fs' % (time.time() - start))
运行以下可以轻易的发现两段代码所执行的结果是一样的、
第一段代码所花的时间
Use time: 100.310s
第二段代码所花时间
Use time: 100.314s
两段代码花费的时间也差不多
代码量、相差无几
这就让我很头痛了
简单的函数调用是两个函数之间调用并返回相应的数据
而协程写的代码是两个函数之间相互调用、相互传送数据也没有做到两个函数同时进行
那么,协程发明的意义在哪里呢?就仅仅为了这0.004s的时间差么?
Consumer 함수 시작 부분에 로직이나 초기화 클래스 코드가 더 있으면 그 격차와 어떤 방식이 더 편리한지 알 수 있을 것입니다.
파이썬에서 코루틴의 장점은 비동기 작업의 코드 일관성입니다. 여기에는 절전 모드 시 전체 스레드가 중지됩니다.
피험자에게 A Curious Course on Coroutines and Concurrency 기사를 읽어보라고 권합니다. 이 기사는 다소 오래되었지만 말입니다.