回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>在当今的多核、多线程cpu(我笔记本上的一个有两个核,每个核有两个线程)的编程世界中,编写能够利用所提供的硬件特性的代码变得越来越有意义。像go(lang)这样的语言诞生是为了让程序员更容易地加速应用程序,方法是生成多个“独立”进程,以便以后再次同步它们。在</p>
<p>在这种情况下,接触Python中的生成器函数,我希望这样的函数将使用在后续项请求之间传递的空闲时间来准备下一个立即交付的结果,但似乎不是这样——至少我对运行下面提供的代码得到的结果的解释是这样的。在</p>
<p>更让我困惑的是,生成器函数的调用者必须等到函数完成后才能处理所有剩余的指令,即使生成器已经传递了所有项目。在</p>
<blockquote>
<p>Are there any clear reasons I can't currently see, why a generator
function doesn't in the idle time between yield requests run the code
past the requested yield until it meets next yield instruction and
even lets the caller wait in case all the items are already delivered?</p>
</blockquote>
<p>这里是我使用的代码:</p>
<pre><code>import time
startTime = time.time()
time.sleep(1)
def generatorFunctionF():
print("# here: generatorFunctionF() lineNo #1", time.time()-startTime)
for i in range(1,4):
print("# now: time.sleep(1)", time.time()-startTime)
time.sleep(1)
print("# before yield", i, time.time()-startTime)
yield i # yield i
print("# after yield", i, time.time()-startTime)
print("# now: time.sleep(5)", time.time()-startTime)
time.sleep(5)
print("# end followed by 'return'", time.time()-startTime)
return
#:def
def standardFunctionF():
print("*** before: 'gFF = generatorFunctionF()'", time.time()-startTime)
gFF = generatorFunctionF()
print("*** after: 'gFF = generatorFunctionF()'", time.time()-startTime)
print("*** before print(next(gFF)", time.time()-startTime)
print(next(gFF))
print("*** after print(next(gFF)", time.time()-startTime)
print("*** before time.sleep(3)", time.time()-startTime)
time.sleep(3)
print("*** after time.sleep(3)", time.time()-startTime)
print("*** before print(next(gFF)", time.time()-startTime)
print(next(gFF))
print("*** after print(next(gFF)", time.time()-startTime)
print("*** before list(gFF)", time.time()-startTime)
print("*** list(gFF): ", list(gFF), time.time()-startTime)
print("*** after: list(gFF)", time.time()-startTime)
print("*** before time.sleep(3)", time.time()-startTime)
time.sleep(3)
print("*** after time.sleep(3)", time.time()-startTime)
return "*** endOf standardFunctionF"
print()
print(standardFunctionF)
print(standardFunctionF())
</code></pre>
<p>给出:</p>
^{pr2}$