我正在尝试理解 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 中的每个值,它会打印
  • 的 id
  • __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
    

    10-07 16:31
    查看更多