Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当列表在python中是线程安全的时,删除它们是否安全?_Python_Multithreading - Fatal编程技术网

当列表在python中是线程安全的时,删除它们是否安全?

当列表在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!")

我在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!")
而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:当然,但这太过分了。信号量在实现中使用条件和锁。你不需要额外的开销,所以也不要使用它。