当列表在python中是线程安全的时,删除它们是否安全?
我在Python3中有一个多线程应用程序,并且有一个列表的setter和getter方法。setter方法将元素追加到列表中,而getter方法在返回元素后删除列表中的所有元素 setter方法如下图所示,位于较大的异步函数中:当列表在python中是线程安全的时,删除它们是否安全?,python,multithreading,Python,Multithreading,我在Python3中有一个多线程应用程序,并且有一个列表的setter和getter方法。setter方法将元素追加到列表中,而getter方法在返回元素后删除列表中的所有元素 setter方法如下图所示,位于较大的异步函数中: while self.semaphor: print("waiting...") time.sleep(0.001) self.semaphor=True self.messages.append(msg) print("appended data!")
while self.semaphor:
print("waiting...")
time.sleep(0.001)
self.semaphor=True
self.messages.append(msg)
print("appended data!")
而getter方法如下所示:
while self.semaphor:
time.sleep(0.001)
self.semaphor = True
l = self.messages
self.messages = []
self.semaphor = False
if len(l) == 0:
return None
else:
return l
但是,应用程序在prinst语句“append data”之后崩溃,没有任何错误消息(可能由于命令行中的多线程输出而隐藏),因此我想知道代码片段是否线程安全且正确?您的代码不是线程安全的,因为您的
self.semaphore
处理不是线程安全的。两个线程在将其设置为True
之前,可以将self.semaphore
读取为False
,因为线程切换可以在指令之间的任意点进行
您想要使用的是a(这里使用的信号量是错误的原语)
创建实例时,设置一个self.messages\u lock=threading.lock()
属性,并在需要更改消息列表时使用:
with self.messages_lock:
# locked block of code, guaranteed to be thread-safe.
或
如果您必须有一个线程打印出它正在等待锁定。您的代码不是线程安全的,因为您的self.semaphore处理不是线程安全的。两个线程在将其设置为True
之前,可以将self.semaphore
读取为False
,因为线程切换可以在指令之间的任意点进行
您想要使用的是a(这里使用的信号量是错误的原语)
创建实例时,设置一个self.messages\u lock=threading.lock()
属性,并在需要更改消息列表时使用:
with self.messages_lock:
# locked block of code, guaranteed to be thread-safe.
或
如果您必须有一个线程打印出它正在等待锁定。您的self.semaphore
标志不是线程安全的,因此您可以同时进行2次写入,也可能发生线程锁定情况。您的代码不是线程安全的,在设置semaphore
属性时存在争用条件。使用一个真正的信号量。要想达到目的,将数据添加到列表是线程安全的,但Python中没有变量?此外,信号量是这里使用的错误对象,您的实际用例将需要一个锁。@Kev1n91:当然,但这太过分了。信号量在实现中使用条件和锁。您不需要额外的开销,所以也不要使用它。您的self.semaphore
标志不是线程安全的,因此您可以同时进行2次写入,也可能发生线程锁定情况。您的代码不是线程安全的,在设置semaphore
属性时存在争用条件。使用一个真正的信号量。要想达到目的,将数据添加到列表是线程安全的,但Python中没有变量?此外,信号量是这里使用的错误对象,您的实际用例将需要一个锁。@Kev1n91:当然,但这太过分了。信号量在实现中使用条件和锁。你不需要额外的开销,所以也不要使用它。