Discuss / Python / 异步io和协程的区别?

异步io和协程的区别?

Topic source

现在从两个文件中读取的代码有两份:

其一:


import asyncio

@asyncio.coroutine
def reader(f):
    for line in open(f):
        print('>>%s' % (line))



def append_task_and_run(r):
    yield from r


file1='asyncDemo1.py'
file2='asyncIODemo.py'

ffff=[file1,file2]

loop=asyncio.get_event_loop()
tasks=[reader(fff) for fff in ffff]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

这是使用异步io

其二:

def reader():
    while True:
        f = yield
        for line in open(f):
            print('>> %s' % line)


def reader_wrapper(coro):
    yield from coro



ffff=['asyncDemo1.py','yieldDemo.py']

rr = reader_wrapper(reader())
rr.send(None)

for ff in ffff:
    rr.send(ff)

这是使用协程

老师,不知道这两种有区别不,总感觉梗在什么地方。。。

灵剑2012

#2 Created at ... [Delete] [Delete and Lock User]

你的后一种只是使用了生成器,并不是协程,只有放到EventLoop里面的生成器才能叫做协程。就算是你的前一种其实也并没有使用异步io,只是在EventLoop里面做了一个同步过程而已。主要的问题在于磁盘文件并没有异步的操作。你需要打开一个socket或者一个subprocess才能使用异步等待。


  • 1

Reply