如何解决有什么情况导致python list.insert或list.remove中的竞争条件吗?
我正在研究Elliot Forbes撰写的“学习python中的并发性”。 在这本书中,解释“默认情况下,列表是线程安全的,但仅以访问它们的方式进行。重要的是要注意,此列表结构中表示的数据实际上不受保护,并且,如果您要安全地修改此数据,则必须实现适当的锁定机制,以确保多个线程不会潜在地竞争。执行中的条件-所有线程安全容器都适用。 append()函数是用于列表数据结构的原子方法(因此是线程安全的)的少数方法之一。列表因此成为一个非常快速和容易的结构,我们可以利用它来进行临时的内存中存储。但是,如果我们试图同时修改该列表中的任何内容,那么很有可能我们开始看到最经常归因于比赛条件的副作用。 这种副作用的一个主要示例是,例如,如果我们尝试更新 列表中的第二个元素与另一个线程同时显示。如果一个是 在竞争线程的同时读取并随后写入,然后 我们可能会看到值更改不正确的问题。 如果您希望在多线程应用程序中使用列表,那么您可以 通过以类似于我们之前的方式扩展类,可以做到这一点 扩展了设置原语。'
因此,我使用了装饰器,因为这本书解释了如何使用装饰器。 但是,我找不到使用未锁定的list.insert()和使用修饰的锁定之间的任何区别。
in 1):t1的结果为10000。t2的结果为20000。最终结果为20000。 我认为由于比赛条件,最终结果应该小于20000。
在2)中:与1)的结果相同。
- 这是不带锁的代码。
'''
from threading import Lock
import threading
list = []
def work():
global list
for i in range(10000):
list.insert(i,i)
print("{} is completed,list length = {}".format(threading.get_ident(),len(list)))
print(list)
threads = []
t1 = threading.Thread(target=work)
t1.start()
t2 = threading.Thread(target=work)
t2.start()
threads.append(t1)
threads.append(t2)
for t in threads:
t.join()
print("final list length = ",len(list))
print(list)
'''
- 这是修饰版本的代码。
'''
from threading import Lock
import threading
def locked_method(method):
def new_method(self,*args,**kwargs):
with self._lock:
return method(self,**kwargs)
return new_method
class Locked_list(list):
def __init__(self,**kwargs):
self._lock = Lock()
super(Locked_list,self).__init__(*args,**kwargs)
@locked_method
def remove(self,**kwargs):
return super(Locked_list,self).remove(elem)
@locked_method
def insert(self,self).insert(index,elem)
list = []
def work():
global list
for i in range(10000):
list.insert(i,len(list))
print(list)
'''
我的代码错误吗?还是python的列表没有任何竞争条件?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。