Python中的线程:类属性(列表)不是线程安全的吗?

杰伊先生42

我试图了解Python中的线程。

代码

现在我遇到一个问题,我将其放在一个简单的类中:

# -*- coding: utf-8 -*-
import threading

class myClassWithThread(threading.Thread):

    __propertyThatShouldNotBeShared = []
    __id = None
    def __init__(self, id):
        threading.Thread.__init__(self)
        self.__id = id

    def run(self):
        while 1:
            self.dummy1()
            self.dummy2()

    def dummy1(self):
        if self.__id == 2:
            self.__propertyThatShouldNotBeShared.append("Test value")


    def dummy2(self):
        for data in self.__propertyThatShouldNotBeShared:
            print self.__id
            print data
            self.__propertyThatShouldNotBeShared.remove(data)



obj1 = myClassWithThread(1)
obj2 = myClassWithThread(2)
obj3 = myClassWithThread(3)

obj1.start()
obj2.start()
obj3.start()

描述

这是类的作用:类具有两个属性:

  • __id 这是对象的标识符,在调用构造函数时给出
  • __propertyThatShouldNotBeShared 是一个列表,将包含一个文本值

现在的方法

  • run()包含一个无限循环,我在其中调用dummy1(),然后dummy2()
  • dummy1()__propertyThatShouldNotBeShared__id当对象的等于2时,向属性(列表)添加值“测试值”
  • dummy2()检查列表的大小__propertyThatShouldNotBeShared是否严格大于0,然后
    • 为其中的每个值__propertyThatShouldNotBeShared打印
    • 对象和包含在其中的值 __propertyThatShouldNotBeShared
    • 然后它删除了价值

这是启动程序时得到的输出:

21

Test valueTest value

2
Test value
Exception in thread Thread-2:
Traceback (most recent call last):
  File "E:\PROG\myFace\python\lib\threading.py", line 808, in __bootstrap_inner
    self.run()
  File "E:\PROG\myFace\myProject\ghos2\src\Tests\threadDeMerde.py", line 15, in run
    self.dummy2()
  File "E:\PROG\myFace\myProject\ghos2\src\Tests\threadDeMerde.py", line 27, in dummy2
    self.__propertyThatShouldNotBeShared.remove(data)
ValueError: list.remove(x): x not in list

问题

如您在输出的第一行中所看到的,我得到的是“ 1”……这意味着,在某些时候,ID为“ 1”的对象试图在屏幕上打印一些东西……实际上!但这应该是不可能的!只有ID为“ 2”的对象才能打印任何内容!

这段代码有什么问题?还是我的逻辑有什么问题?

怪异的

问题是这样的:

class myClassWithThread(threading.Thread):
    __propertyThatShouldNotBeShared = []

它为所有共享对象定义一个列表。你应该做这个:

class myClassWithThread(threading.Thread):
    def __init__(self, id):
        self.__propertyThatShouldNotBeShared = []
        # the other code goes here

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Delphi中类属性线程安全吗?

来自分类Dev

多线程列表[Queue()]线程安全吗?

来自分类Dev

Python线程中的heapq安全吗?

来自分类Dev

列表复制线程安全吗?

来自分类Dev

列表复制线程安全吗?

来自分类Dev

WPF中的图像处理不是线程安全的吗?

来自分类Dev

python的“ in”语言为列表构造线程安全吗?

来自分类Dev

此代码不是线程安全的吗?

来自分类Dev

互锁。增量不是线程安全的吗?

来自分类Dev

这段代码在python线程模块中安全吗?

来自分类Dev

Java中不是CuncurrentSkipListMap的线程安全方法

来自分类Dev

键是线程ID时,Python字典是线程安全的吗?

来自分类Dev

Python multiprocessing.Queue线程安全吗?

来自分类Dev

Python重新加载线程安全吗?

来自分类Dev

在HashSet <T>中包含线程安全吗

来自分类Dev

这在Java中是线程安全的吗?

来自分类Dev

libgdx中的此方案线程安全吗?

来自分类Dev

SQLAlchemy线程中的事务安全吗?

来自分类Dev

Qt中的connect()调用线程安全吗?

来自分类Dev

匕首2线程中的@Singleton安全吗?

来自分类Dev

Redis中的FLUSHALL ASYNC线程安全吗?

来自分类Dev

MyBatis中的selectKey线程安全吗?

来自分类Dev

在 CPython 中检查 None 线程安全吗?

来自分类Dev

安全地中止线程列表中的线程

来自分类Dev

qDebug()线程安全吗?

来自分类Dev

XCGLogger线程安全吗?

来自分类Dev

localStorage线程安全吗?

来自分类Dev

ThreadLocal线程安全吗?

来自分类Dev

DataRowCollection线程安全吗?