Ema*_*ini 9 python multithreading numpy pandas
我正在使用pandasWeb服务器(apache + modwsgi + django)并且有一个难以重现的错误,现在我发现它是由大熊猫不是线程安全引起的.
经过大量的代码缩减后,我终于找到了一个简短的独立程序,可以用来重现问题.你可以在下面看到它.
关键是:与这个问题的答案相反,这个例子表明即使使用非简单的操作也不会修改数据帧,大熊猫就会崩溃.我无法想象这个简单的代码片段如何可能对线程不安全......
问题是在Web服务器中使用pandas和numpy.可能吗?我怎么用庞大熊来修复我的代码?(锁定使用的一个例子会很有帮助)
以下是导致分段错误的代码:
import threading
import pandas as pd
import numpy as np
def let_crash(crash=True):
    t = 0.02 * np.arange(100000) # ok con 10000                                                                               
    data = pd.DataFrame({'t': t})
    if crash:
        data['t'] * 1.5  # CRASH
    else:
        data['t'].values * 1.5  # THIS IS OK!
if __name__ == '__main__':
        threads = []
        for i in range(100):
            if True:  # asynchronous                                                                                          
                t = threading.Thread(target=let_crash, args = ())
                t.daemon = True
                t.start()
                threads.append(t)
            else:  # synchronous                                                                                              
                let_crash()
        for t in threads:
            t.join()
我的环境:python 2.7.3,numpy 1.8.0,pandas 0.13.1
请参阅文档中的警告:http://pandas.pydata.org/pandas-docs/dev/gotchas.html#thread-safety
pandas不是线程安全的,因为底层的复制机制不是.Numpy我相信有一个原子复制操作,但是pandas有一层高于此.
复制是pandas操作的基础(因为大多数操作生成一个新对象以返回给用户)
解决这个问题并不是一件容易的事情,并且需要相当大的性能,因此需要一些工作才能正确处理.
最简单的方法就是不跨线程共享对象或在使用时锁定它们.