Python中的线程:类属性(列表)不是线程安全的?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python中的线程:类属性(列表)不是线程安全的?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2194字,纯文字阅读大概需要4分钟。
内容图文
我试图理解Python中的Threads.
代码
现在我遇到了一个问题,我在一个简单的课程中包含了这个问题:
# -*- 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
内容总结
以上是互联网集市为您收集整理的Python中的线程:类属性(列表)不是线程安全的?全部内容,希望文章能够帮你解决Python中的线程:类属性(列表)不是线程安全的?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。