Python:为什么不同的线程从一个生成器获取自己的一系列值?

2023-12-06

我正在学习Python 中的多线程。我想知道如何使用生成器向多个线程提供数据。这是我写的:

  import threading

  data = [i for i in xrange(100)]

  def generator():
      for i in data:
          yield i

  class CountThread(threading.Thread):
      def __init__(self, name):
          threading.Thread.__init__(self)
          self.name = name

      def run(self):
          for i in generator():
              print '{0} {1}'.format(self.name, i)

  a = CountThread('a')
  b = CountThread('b')
  a.start()
  b.start()

我以为这个列表只会迭代一次。但似乎每个线程都独立地通过列表进行交互。

output:

a 0
a 1
a 2
b 0
a 3
a 4
b 1
b 2
a 5
a 6
a 7
a 8
a 9
b 3
b 4
b 5
b 6
b 7
b 8
...
(200 lines)

这背后的根本原因是什么?如何重写程序,以便列表中的值仅打印一次。


您在每个线程中实例化一个新的生成器run与此功能:

for i in generator():

each generator调用返回生成器的新实例:

>>> data = [i for i in xrange(10)]
>>> a, b = generator(), generator()
>>> id(a), id(b)
(37528032, 37527952)

Here a and b有不同的 id,即使没有线程也会生成相同的结果:

>>> list(a), list(b)
([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

但请注意,生成器不是线程安全的,在线程应用程序中使用它们很棘手。你不必担心锁定,参见示例,否则你会得到ValueError: generator already executing偶尔会出错。或者你可以使用队列.队列用于线程通信。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:为什么不同的线程从一个生成器获取自己的一系列值? 的相关文章

  • 将 saxon 与 python 结合使用

    我需要使用 python 处理 XSLT 目前我正在使用仅支持 XSLT 1 的 lxml 现在我需要处理 XSLT 2 有没有办法将 saxon XSLT 处理器与 python 一起使用 有两种可能的方法 设置一个 HTTP 服务 接受
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • 为 Anaconda Python 安装 psycopg2

    我有 Anaconda Python 3 4 但是每当我运行旧代码时 我都会通过输入 source activate python2 切换到 Anaconda Python 2 7 我的问题是我为 Anaconda Python 3 4 安
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • 使用 matplotlib 绘制时间序列数据并仅在年初显示年份

    rcParams date autoformatter month b n Y 我正在使用 matpltolib 来绘制时间序列 如果我按上述方式设置 rcParams 则生成的图会在每个刻度处标记月份名称和年份 我怎样才能将其设置为仅在每
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • 无锁算法真的比全锁算法性能更好吗?

    陈雷蒙德 http blogs msdn com b oldnewthing 一直在做一个huge http blogs msdn com b oldnewthing archive 2011 04 15 10154245 aspx ser
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • 使用 opencv 计算虚拟相机的单应性

    我有一个平面图像 我想计算一个图像扭曲 它可以为我提供从位于 3d 空间中另一个点的虚拟相机看到的同一平面的合成视图 因此 给定图像 I1 我想计算代表从虚拟相机看到的图像 I1 的图像 I2 理论上 存在将这两个图像关联起来的单应性 给定
  • 如何使 LinearLayout 可滚动?

    我的屏幕上有很多项目 我需要使用滚动条 以便用户可以向下滚动 但是 滚动条要么不可见 要么不起作用 如何给页面添加滚动条LinearLayout 用 a 包裹线性布局
  • 如何在 Perl 中从 HTML 中提取 URL 和链接文本?

    我之前问过如何在 Groovy 中做到这一点 但是 由于所有 CPAN 库 现在我正在用 Perl 重写我的应用程序 如果页面包含这些链接 a href http www google com Google a a href http ww
  • 如何设置网站图标?

    我正在尝试做一个非常简单的初步练习来建立一个创建网站图标的网站 这是我正在使用的代码 但它不起作用 有人可以帮忙吗 我已将文件 favicon ico 保存在与 html 文件相同的级别 在子目录中 非常感谢 随着 i android wi
  • 什么是 .pid 文件以及它包含什么?

    我最近遇到了一个扩展名为 pid 的文件 并查看了它的内部 但没有找到太多内容 这文档 says Pid 文件是包含进程标识号 pid 的文件 该文件存储在文件系统的明确定义位置 从而允许其他程序找到正在运行的脚本的 pid 任何人都可以对
  • 关于 Objective-C/Cocoa 中工厂方法对象生命周期的问题(保留或不保留...)

    通过阅读 SDK 中的内存管理文档 我发现工厂方法 静态构造函数方法 通常会为我保留该对象并将其添加到自动释放池中 这意味着只要池没有在我预期之前释放 我就不需要保留和释放对象 对于 main 中的默认自动释放池 这应该位于应用程序的末尾
  • 在多个号码字段中搜索多个号码

    ID 1 5 1 6 3 4 1 36 1 我有这些 1 6 36 要搜索的号码 它应该找到包含 1 OR 6 OR 36 的任何行 例如上表中总共 4 行 I tried FIND IN SET ID 1 6 36 ID IN 1 6 3
  • AngularJs 无限循环

    以下index html页面导致无限循环 重现 在 本地或远程 Web 服务器上下载下面链接的 github 项目 我已经在 plunker 上尝试过 并且没有发生无限循环 从您的浏览器请求它 单击页面上的 p1p2 链接 无限循环开始 在
  • MySQL5.6卡在进程“试图启动服务”上

    我获得了适用于 Windows 7 32 位的 MySQL 5 6 社区服务器版本 还下载了相同 Windows 版本的 Windows 安装程序 一切准备都正确 我在博客上看到给我一份在 winodws7 32 位上安装 MySQL 5
  • 如何找到向量的重复元素并输出该重复项的整数外观而不是逻辑值?

    我们知道 duplicate 函数输出一个逻辑向量 然而 我想要的是一个整数向量 如果这是该特定元素第 n 1 次出现 则输出向量的相应元素为 n 例如 如果我们调用我正在寻找的函数 intDuplicate 那么我需要以下输出 gt x
  • 在 C 中从文件中读取长行时处理内存

    首先 我知道这个问题非常接近这个话题 但是这个问题的措辞非常糟糕 我什至不确定它是重复的 而且没有显示代码 所以我认为应该正确地询问它 我正在尝试逐行读取文件 并且我需要将一行特别存储在variable 我已经成功地使用轻松地做到了这一点f
  • android:如何使用模拟(假)坐标修复GPS?

    当 GPS 信号不可用时 我尝试以编程方式修复 GPS 我想这样做是为了向其他应用程序 如谷歌地图和其他应用程序 提供模拟坐标 我尝试使用 GPS PROVIDER 和 NETWORK PROVIDER 但只有后者我才能获得对谷歌地图有效的
  • 错误:无法获取现有工作区:container.Client#ListBlobs:

    Error Failed to get existing workspaces containers Client ListBlobs Failure responding to request StatusCode 403 Origina
  • Laravel 路由变化

    我有一个类别表 如下所示 id parent id name 1 0 electronics 2 1 Televisions 3 2 LCD TVs 4 2 Plasma Tvs 5 1 DVD Players 6 1 Bluray Pla
  • HTML5 - 一起开始音频和视频?

    我该如何让音频和视频同时开始使用
  • 当我调用函数而不将其返回值分配给变量时会发生什么? [复制]

    这个问题在这里已经有答案了 假设我有以下功能 int foo return 1234 调用此函数而不将其返回值分配给任何变量的效果是什么 foo 另外 使用运算符而不将其返回值分配给任何变量的效果是什么 1 2 3 在 C 中 表达式是有效
  • 方法与类型中的另一个方法具有相同的擦除

    为什么在同一个类中存在以下两个方法是不合法的 class Test void add Set
  • SSIS - 轮询文件文件夹和触发 ETL 包

    需要建议 请参阅下面的场景 我们开发了1个ETL包 可以一次处理5个文件 通常需要1分钟 我们预计早上 也就是说早上 6 点到 7 点之间 可以有近 100 个以上的文件进入 PROCESSING 文件夹 我正在努力设计 开发某种轮询机制
  • 按下后退按钮时如何清除 Fragment 上的 ListView?

    所有数据均来自该ListView由一个提供CursorAdapter 每当我按下后退按钮并return活动 然后单击该活动以开始我的活动fragment 所有以前的数据仍然相互堆叠 1 创建接口BackPressedListener pub
  • Python:为什么不同的线程从一个生成器获取自己的一系列值?

    我正在学习Python 中的多线程 我想知道如何使用生成器向多个线程提供数据 这是我写的 import threading data i for i in xrange 100 def generator for i in data yie