多线程:为什么生成器不是线程安全的?在线程之间共享时会发生什么?

Haiyang

我正在阅读这个问题,询问生成器是否是线程安全的,一个答案说:

它不是线程安全的;同时调用可能交错,并与局部变量混淆。

另一个答案表明,您可以使用锁来确保一次只有一个线程使用生成器。

我是多线程新手。谁能设计出一个例子来说明当您使用无锁发生器时发生了什么?

例如,如果我这样做,似乎没有任何问题:

import threading

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 gen():
            print '{0} {1}'.format(self.name, i)

data = [i for i in xrange(100)]
gen = generator()
a = CountThread('a')
b = CountThread('b')
a.start()
b.start()
托马斯·奥罗斯科

运行此示例。

您将看到10,000个数字将在线程之间“共享”。您不会在两个线程中看到10000个数字。

实际上,一个线程最有可能看到所有数字。

import threading

class CountThread(threading.Thread):
  def __init__(self, gen):
      threading.Thread.__init__(self)
      self.gen = gen
      self.numbers_seen = 0

  def run(self):
      for i in self.gen:
          self.numbers_seen += 1


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

gen = generator(xrange(10000))

a = CountThread(gen)
b = CountThread(gen)

a.start()
b.start()

a.join()
b.join()

print "Numbers seen in a", a.numbers_seen
print "Numbers seen in b", b.numbers_seen

实际上,如果发生Python在执行期间切换线程的情况(只是使用一个大于10000的值,例如10000000),则会得到一个异常:

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 808, in __bootstrap_inner
    self.run()
  File "test.py", line 10, in run
    for i in self.gen:
ValueError: generator already executing

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

多线程程序创建新进程时会发生什么?

来自分类Dev

多线程程序创建新进程时会发生什么?

来自分类Dev

如何在线程之间共享对象以证明它不是线程安全的?

来自分类Dev

为什么在线程之间共享静态变量会降低性能?

来自分类Dev

为什么在线程之间共享静态变量会降低性能?

来自分类Dev

在 Swift 中,当两个线程获取并设置非线程安全属性时会发生什么?

来自分类Dev

Java Runnable多线程在线程之间共享中心对象

来自分类Dev

在线程之间共享mvar

来自分类Dev

在线程之间共享容器阵列

来自分类Dev

在线程之间共享变量的方法

来自分类Dev

pthreads在线程之间共享内存

来自分类Dev

多线程问题-在线程之间传递对象

来自分类Dev

为什么在线程之间切换比在进程之间切换和在它们之间共享数据要快?

来自分类Dev

在线程之间发送数据的惯用方式是什么?

来自分类Dev

在以下多线程场景中会发生什么?

来自分类Dev

为什么不是线程安全?如何获得线程安全?

来自分类Dev

Play框架:当请求超出可用线程时会发生什么

来自分类Dev

为什么此代码不是线程安全的?

来自分类Dev

为什么此分配不是线程安全的?

来自分类Dev

为什么std :: queue不是线程安全的?

来自分类Dev

什么是线程安全的,线程兼容之间的区别?

来自分类Dev

提供未确定寿命的布尔值以在线程之间共享的最简单方法是什么?

来自分类Dev

C ++在线程之间共享状态的最佳方法

来自分类Dev

如何在线程之间共享对AtomicBool的访问?

来自分类Dev

在线程之间共享对象的最佳方法?

来自分类Dev

如何在线程之间共享非发送对象?

来自分类Dev

在线程之间共享字典中的数据

来自分类Dev

如何在线程之间共享巨大的进程

来自分类Dev

在线程之间共享资源(文件,互斥体)

Related 相关文章

  1. 1

    多线程程序创建新进程时会发生什么?

  2. 2

    多线程程序创建新进程时会发生什么?

  3. 3

    如何在线程之间共享对象以证明它不是线程安全的?

  4. 4

    为什么在线程之间共享静态变量会降低性能?

  5. 5

    为什么在线程之间共享静态变量会降低性能?

  6. 6

    在 Swift 中,当两个线程获取并设置非线程安全属性时会发生什么?

  7. 7

    Java Runnable多线程在线程之间共享中心对象

  8. 8

    在线程之间共享mvar

  9. 9

    在线程之间共享容器阵列

  10. 10

    在线程之间共享变量的方法

  11. 11

    pthreads在线程之间共享内存

  12. 12

    多线程问题-在线程之间传递对象

  13. 13

    为什么在线程之间切换比在进程之间切换和在它们之间共享数据要快?

  14. 14

    在线程之间发送数据的惯用方式是什么?

  15. 15

    在以下多线程场景中会发生什么?

  16. 16

    为什么不是线程安全?如何获得线程安全?

  17. 17

    Play框架:当请求超出可用线程时会发生什么

  18. 18

    为什么此代码不是线程安全的?

  19. 19

    为什么此分配不是线程安全的?

  20. 20

    为什么std :: queue不是线程安全的?

  21. 21

    什么是线程安全的,线程兼容之间的区别?

  22. 22

    提供未确定寿命的布尔值以在线程之间共享的最简单方法是什么?

  23. 23

    C ++在线程之间共享状态的最佳方法

  24. 24

    如何在线程之间共享对AtomicBool的访问?

  25. 25

    在线程之间共享对象的最佳方法?

  26. 26

    如何在线程之间共享非发送对象?

  27. 27

    在线程之间共享字典中的数据

  28. 28

    如何在线程之间共享巨大的进程

  29. 29

    在线程之间共享资源(文件,互斥体)

热门标签

归档