我在网络服务器(apache + modwsgi + django)上使用pandas
,并且有一个难以复制的bug,现在我发现它是由不是线程安全的熊猫引起的。熊猫和numpy线程安全
经过大量的代码缩减后,我终于找到了一个简短的独立程序,可以用来重现问题。你可以在下面看到它。
重点是:与this question的回答相反,这个例子表明即使非常简单的操作不会修改数据帧,熊猫也会崩溃。我无法想象这个简单的代码片断如何可能与线程不安全...
问题是关于在网络服务器中使用熊猫和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()
我的环境:蟒2.7.3,1.8.0 numpy的,熊猫0.13.1
不会为我崩溃。 Python 2.7.6,numpy 1.8.2,熊猫0.14.1。我尝试了主循环,直到“10000”。 – osa 2014-09-24 04:22:50