python列表是线程安全的吗,python迭代器和线程安全

我有一个由两个函数操作的类.一个函数创建一个小部件列表并将其写入类中:

def updateWidgets(self):

widgets = self.generateWidgetList()

self.widgets = widgets

另一个函数以某种方式处理小部件:

def workOnWidgets(self):

for widget in self.widgets:

self.workOnWidget(widget)

这些函数中的每一个都在它自己的线程中运行.问题是,如果updateWidgets()线程在workOnWidgets()线程运行时执行会发生什么?

我假设作为for … in循环的一部分创建的迭代器将保留对旧的self.widgets对象的某种引用?所以我将完成旧列表的迭代……但我很想知道.

解决方法:

updateWidgets()不会改变self.widgets(这可能是一个问题),而是用新列表替换它.对旧的引用至少保持到workOnWidgets()中的for循环完成,所以这应该不是问题.

简化,你正在做的是这样的:

>>> l=[1,2,3]

>>> for i in l:

... l=[]

... print(i)

...

1

2

3

但是,如果修改了迭代的列表,则会遇到问题:

>>> l=[1,2,3]

>>> for i in l:

... l[2]=0

... print(i)

...

1

2

0

标签:python,iterator,atomic,multithreading,thread-safety

来源: https://codeday.me/bug/20190627/1300095.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值