Python 从send()而不是next()开始运行协同程序
我正在从David Beazley的精彩演讲中学习协同程序 我对一个简单的任务示例感到非常困惑,在这个示例中,生成器开始运行时没有继续Python 从send()而不是next()开始运行协同程序,python,python-3.x,coroutine,Python,Python 3.x,Coroutine,我正在从David Beazley的精彩演讲中学习协同程序 我对一个简单的任务示例感到非常困惑,在这个示例中,生成器开始运行时没有继续next() 它开始时没有下一个() 至于福 In [10]: f1 = foo() In [11]: f1.send(1)
next()
它开始时没有下一个()
至于福
In [10]: f1 = foo()
In [11]: f1.send(1)
TypeError: can't send non-None value to a just-started generator
它应该提前以next()
开始
我如何理解这种情况?错误描述告诉您什么是错误的以及您应该做什么-您应该将
None
发送到刚刚创建的生成器。这是f1.send(None)
而不是f1.send(1)
。通常情况下,协同程序与您在问题中提供的装饰器(classTask
及其方法run
)一起使用,或者与以下装饰器类似:
def coroutine(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
generator = func(*args, **kwargs)
next(generator)
return generator
return wrapper
为什么任务在不调用next()的情况下运行?它没有装饰程序。
generator.send(None)
是next(generator)
的替代方法t1=Task(foo())
基本上是装饰性的,我明白了。foo()是一个被调用的函数,看起来是一个奇怪的装饰。
In [10]: f1 = foo()
In [11]: f1.send(1)
TypeError: can't send non-None value to a just-started generator
def coroutine(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
generator = func(*args, **kwargs)
next(generator)
return generator
return wrapper