搜尋

首頁  >  問答  >  主體

python - 协程的真正的意义在哪里?我写了两个程序对比

我写了两段代码分别执行、
第一段代码:
由廖雪峰老师的程序改编使用了协程的思维

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的时间差么?

PHP中文网PHP中文网2888 天前407

全部回覆(3)我來回復

  • PHP中文网

    PHP中文网2017-04-18 09:07:07

    如果 consumer 函數開始部分再多一些邏輯或初始化類別的程式碼,你就知道差距和哪個寫法比較方便了。

    回覆
    0
  • 怪我咯

    怪我咯2017-04-18 09:07:07

    python裡協程的好處是非同步操作的程式碼連貫性,你這裡也沒有非同步操作,sleep的時候整個執行緒都停了

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:07:07

    推薦題主看看這篇文章A Curious Course on Coroutines and Concurrency吧,雖說有點舊。

    回覆
    0
  • 取消回覆