您可能指的是coroutine,它利用产量表达式。它的工作原理有点像这样:
def co_gen(li):
for x in li:
bad = yield x
if bad is not None:
print('ack! {}'.format(bad))
#other error handling
和(人为)用法:
states = ["IL", "NY", "NJ"]
gen = co_gen(states)
for x in gen:
print('processing state: {}'.format(x))
if x == 'NY':
y = gen.send('Boo, Yankees!')
print('processing state after error: {}'.format(y))
# processing state: IL
# processing state: NY
# ack! Boo, Yankees!
# processing state after error: NJ
要点 - 正常yield
行为分配None
到bad
。如果它不是None,那么已将send
装入生成器。
当我们send
东西进入发生器,它恢复运行,直到它达到下一个产量表达。所以记住这一点 - 协程中的上述控制流程并不是我所称的“标准”,因为在错误块中没有完成yield
。
这里是工作有点更像是你所讲的协同程序:
def co_gen(li):
for x in li:
bad = yield x
while bad is not None:
print('error in generator: {}'.format(bad))
yield
bad = yield bad
gen = co_gen(states)
for x in gen:
print('processing state: {}'.format(x))
if random.choice([0,1]):
gen.send(x) #discard first yield
print('error: trying {} again'.format(x))
# processing state: IL
# error in generator: IL
# error: trying IL again
# processing state: IL
# processing state: NY
# error in generator: NY
# error: trying NY again
# processing state: NY
# processing state: NJ
我们send
我们的国家回到发生器,它不断地产生,直到我们停止发送。
这看起来像一个无限循环给我。你可以把它放到第二个列表中“稍后处理”,否则你将继续处理同一个项目并将它放回列表中? – Cuadue
它有一个外部依赖(基于互联网),所以当有连接它会继续,我会添加一些计时器,然后允许无限运行(以为它不会)。 – PascalVKooten