改写程序first函数等待long函数返回值的方式为yield,代码如下:
import _thread
import time
gen = None
def long():
print ('long execute')
def fun():
time.sleep(5)
result = 'long end'
gen.send(result)
_thread.start_new_thread(fun,())
def first():
print ('first execute')
ret = yield long()
print (ret)
print ('fisrt end')
def second():
print ('second execute')
print ('second end')
def main():
global gen
gen = first()
gen.__next__()
second()
if __name__=='__main__':
main()
解释一下:定义了全局变量gen,将first()函数赋值给gen,gen实际是一个生成器,因为first函数中有yield,当运行gen.__next()__时,程序运行到yield代码,暂停,相当于first()函数已经返回,long函数开始执行,主线程继续向下执行,long函数中新起了一个线程,该线程执行fun函数,fun函数执行完成通过gen.send(result)方式,将result的值赋给first函数中的ret,同时first函数寻找下一个yield关键字,由于没有yield关键字程序会报错。