千家信息网

怎么使itertools.tee线程安全

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,怎么使itertools.tee线程安全,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。我们说到了, itertools.tee 不是线程
千家信息网最后更新 2026年11月04日怎么使itertools.tee线程安全

怎么使itertools.tee线程安全,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

我们说到了, itertools.tee 不是线程安全的,并给出了一个例子,如下图所示:

在两个线程里面同时运行分裂出来的生成器对象,就会导致报错。

现在,你想看看itertools.tee的源代码,但是你会发现,在 PyCharm 里面,它的源代码如下图所示:

这是因为,在 CPython 中,itertools.tee底层是通过 C 语言实现的,所以你不能在 PyCharm 中看到它的源代码。但是你可以通过阅读 Python 的源代码中的 Modules/itertoolsmodule.c 文件[1],找到它的实现算法。

导致问题的核心部分在如下图所示的两段代码中:

大家看不懂也没有关系,根据我上一篇文章中使用 Python 实现的简化版本就足够帮助理解了。

我们使用简化版本来解释其中线程不安全的地方:

def generator():
for i in range(3):
yield f'我是你第{i}个爷爷'

def split(g):
value_list_1 = []
value_list_2 = []
def wrap(queue):
while True:
if not queue:
try:
value = next(g)
except StopIteration:
return
value_list_1.append(value)
value_list_2.append(value)
yield queue.pop(0)
g_1 = wrap(value_list_1)
g_2 = wrap(value_list_2)
return g_1, g_2

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 中,生成器不是线程安全的。

那么如何让itertools.tee分裂出来的多个生成器可以在多线程中运行呢?其关键因素就是让value = next(g)这一行一次只能让一个线程运行。所以我们可以通过加锁来实现。

import itertools
from threading import Lock


class KingnameTee:
def __init__(self, tee_obj, lock):
self.tee_obj = tee_obj
self.lock = lock

def __iter__(self):
return self

def __next__(self):
with self.lock:
return next(self.tee_obj)

def __copy__(self):
return KingnameTee(self.tee_obj.__copy__(), self.lock)

def safe_tee(iterable, n=2):
"""tuple of n independent thread-safe iterators"""
lock = Lock()
return tuple(KingnameTee(tee_obj, lock) for tee_obj in itertools.tee(iterable, n))

我们来看看运行效果:

多线程完美运行。

看完上述内容,你们掌握怎么使itertools.tee线程安全的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

线程 运行 安全 源代码 生成器 问题 生成 两个 内容 可以通过 同时 方法 更多 版本 篇文章 束手无策 为此 一行 代码 例子 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡 互联网科技海报 上海挚品互联网科技有限公司 博彦科技互联网金融 猪兼强互联网科技 上海喔噻互联网科技 智慧科技互联网 顺玮阁互联网科技 科技赋能互联网健康 互联网科技公司需要的职位 互联网媒体平台算高科技产业 洛阳昕诺飞互联网科技有限公司 互联网科技和法律行业 南通创西澳互联网科技有限公司 小米互联网科技园入驻 郑州欣桑互联网科技有限公司 陕西彩京云互联网科技有限公司 互联网科技大会大佬 宁波允成互联网科技有限公司 恒生科技互联网指数十大成分股 互联网科技有限公司 喔噻互联网科技有限公司 高科技互联网 奇酷互联网科技公司 科技伦理 互联网公司 汉立互联网科技有限公司联系电话 互联网科技项目计划书材料类 宝灵互联网科技有限公司 长沙茂晟互联网科技有限公司 银川新华互联网科技学校原画
0