相关疑难解决方法(0)

大熊猫和numpy线程安全

我正在使用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: …
Run Code Online (Sandbox Code Playgroud)

python multithreading numpy pandas

9
推荐指数
1
解决办法
5207
查看次数

在 pandas.Series.reindex(, copy=True) 的这种用法中,线程不安全的根源是什么?

调用pd.Series.reindex不是线程安全的(https://github.com/pandas-dev/pandas/issues/25870)。我的问题是,即使没有人写入该对象的数据,为什么Series.reindex(它返回一个副本并且看起来像是一个纯功能操作)不是线程安全的?

我正在执行的操作是:

s = pd.Series(...)
f(s)  # Success!

# Thread 1:
   while True: f(s)  

# Thread 2:
   while True: f(s)  # Exception !
Run Code Online (Sandbox Code Playgroud)

... f(s) 失败:s.reindex(..., copy=True)。

那么,为什么线程调用失败了呢?我对此感到惊讶,因为如果有任何线程不安全的调用,例如填充系列的索引,我会认为这些会在主线程中完成它们的变异工作。

Pandas确实有一个未解决的问题,.copy它不是线程安全的。然而,这里的讨论是围绕着人们同时读取和写入对象的问题。 https://github.com/pandas-dev/pandas/issues/2728

维护者将.reindex非线程安全问题标记为https://github.com/pandas-dev/pandas/issues/2728的副本 。我怀疑它有相同的原因,但如果.copy是来源,那么我怀疑几乎所有的熊猫在任何情况下都不是线程安全的,对于“功能纯”的操作。

import traceback
import pandas as pd
import numpy as np
from multiprocessing.pool import ThreadPool

def f(arg):
    s,idx = arg
    try:
        # s.loc[idx].values   # No problem
        s.reindex(idx) # Fails
    except Exception: …
Run Code Online (Sandbox Code Playgroud)

python multithreading pandas

5
推荐指数
0
解决办法
136
查看次数

如何以线程安全的方式快速更新列表列表? - 蟒蛇

我正在编写一个脚本,将一个"列"添加到500 Hz的Python列表中.以下是生成测试数据并通过单独线程传递的代码:

# fileA
import random, time, threading
data = [[] for _ in range(4)]  # list with 4 empty lists (4 rows)
column = [random.random() for _ in data]  # synthetic column of data
def synthesize_data():
    while True:
        for x,y in zip(data,column):
            x.append(y)
        time.sleep(0.002)  # equivalent to 500 Hz
t1 = threading.Thread(target=synthesize_data).start()
# example of data
# [[0.61523098235, 0.61523098235, 0.61523098235, ... ],
# [0.15090349809, 0.15090349809, 0.15090349809, ... ],
# [0.92149878571, 0.92149878571, 0.92149878571, ... ],
# [0.41340918409, 0.41340918409, 0.41340918409, ... …
Run Code Online (Sandbox Code Playgroud)

python multithreading list python-2.7

2
推荐指数
1
解决办法
154
查看次数

标签 统计

multithreading ×3

python ×3

pandas ×2

list ×1

numpy ×1

python-2.7 ×1