g = generator() g_1, g_2 = split(g) for value in g_1: print(value)
for value in g_2: print(value)
当两个线程同时运行到if not queue时,发现当前各自的队列都是空的,于是进入value = next(g)获取下一个值。其中,线程 A 先进入那么几毫秒。然后线程 B 进入value = next(g)。但由于此时线程 A 中的next(g)正在运行,尚未结束,线程 B 又跑来运行,于是就导致了报错的发生。Python 中,生成器不是线程安全的。
defsafe_tee(iterable, n=2): """tuple of n independent thread-safe iterators""" lock = Lock() returntuple(KingnameTee(tee_obj, lock) for tee_obj in itertools.tee(iterable, n))