不,熊猫不是线程安全的。而且它的线程安全性也不惊人。当另一个线程正在使用时,我可以从pandas数据框中删除吗?

福格达博特!不。通常不会,甚至对于GIL锁定的python数据结构也不会。当别人给熊猫写东西的时候,我能读懂它吗?

我可以在我的线程中复制一个pandas数据帧,并处理它吗?

实际上,我认为这是相当合理的(即预期的)行为。我不希望能够同时从任何数据结构进行读写或复制,除非:I)它是为并发而设计的,或者ii)我对该对象有一个独占锁,并且从它派生的所有视图对象都是视图,pandas可能还有其他视图对象。我能在别人不给熊猫写东西的时候读它吗?

对于Python中几乎所有的数据结构,答案都是肯定的。对熊猫来说,这似乎不是目前的设计目标。

通常,如果没有人执行变异操作,则可以对对象执行“读取”操作。不过,你得谨慎一点。一些数据结构,包括pandas,执行memoization,以缓存昂贵的操作,而这些操作在功能上是纯的。在Python中实现无锁备忘录通常很容易:@property

def thing(self):
if _thing is MISSING:
self._thing = self._calc_thing()
return self._thing

。。。它简单而安全(假设赋值是安全的原子的——并非每种语言都是这样,而是在CPython中,除非重写setattribute)。

首次使用时,Pandas、series和dataframe索引的计算很慢。我希望(但我在文件中看不到保证),它们是以类似的安全方式完成的。

对于所有库(包括pandas),我希望如果没有人执行变异操作,所有类型的只读操作(或者更具体地说,“功能纯”操作)都是线程安全的。我认为这是一个“合理的”容易实现的,普通的,较低的螺纹安全杆。

然而,对于熊猫,你不能假定这一点。即使您可以保证没有人对您的对象执行“功能不全”操作(例如写入单元格、添加/删除列),pandas也不是线程安全的。

下面是最近的一个例子:https://github.com/pandas-dev/pandas/issues/25870(它标记为.copy not threadsafe问题的副本,但它可能是一个单独的问题)。

s = pd.Series(...)
f(s) # Success!
# Thread 1:
while True: f(s)
# Thread 2:
while True: f(s) # Exception !

。。。对于f(s): s.reindex(..., copy=True)失败,这将返回结果a作为新对象——您可能认为它在功能上是纯的,并且是线程安全的。不幸的是,事实并非如此。

这样做的结果是,我们不能在生产中使用pandas作为我们的医疗分析系统——我现在不鼓励它用于内部开发,因为它使只读操作的内存并行化变得不安全。(!!)

维护人员将此标记为https://github.com/pandas-dev/pandas/issues/2728的副本。我很怀疑,但是如果.copy是来源,那么几乎所有的熊猫在任何情况下都不是线程安全的(这是他们的建议)。

啊!