Python 与多处理一起使用时,Pandasql挂起

Python 与多处理一起使用时,Pandasql挂起,python,multiprocessing,pandasql,Python,Multiprocessing,Pandasql,将pandasql与多处理一起使用最终会在某些时候挂起(即当多个进程同时使用时) 匹配函数在单个输入数据集上运行良好(不使用多处理)。多处理代码可以与其他函数配合使用。当匹配函数用于多处理时,一个或多个进程往往会挂起。我还尝试将多处理上下文更改为“spawn”,以避免从父进程复制锁,但这没有帮助 def matching(inputData): q = """ SELECT df1.time, df2.time,

将pandasql与多处理一起使用最终会在某些时候挂起(即当多个进程同时使用时)

匹配函数在单个输入数据集上运行良好(不使用多处理)。多处理代码可以与其他函数配合使用。当匹配函数用于多处理时,一个或多个进程往往会挂起。我还尝试将多处理上下文更改为“spawn”,以避免从父进程复制锁,但这没有帮助

def matching(inputData):
    q = """
        SELECT
            df1.time,
            df2.time,
            df1.lat,
            df2.lat,
            df1.lng,
            df2.lng,
            (JulianDay(df2.time) - JulianDay(df1.time)) * 24 * 60  as timeDiff
        FROM 
            df1
        LEFT JOIN
            df2
        WHERE
            timeDiff < 5 AND 
            timeDiff >= -2 AND
            ABS(df1.lat - df2.lat) < .02 AND
            ABS(df1.lng - df2.lng) < .02;
    """
    currentDate, df1, df2 = inputData
    result = pandasql.sqldf(q, locals())
    return result

pool = multiprocessing.Pool(multiprocessing.cpu_count())
df = pandas.concat(pool.map(matching, matchingData))
pool.close()
pool.join()
def匹配(输入数据):
q=”“”
挑选
时间,
时间,
df1.lat,
df2.lat,
df1.1液化天然气,
df2.1液化天然气,
(JulianDay(df2.时间)-JulianDay(df1.时间))*24*60作为时间差
从…起
df1
左连接
df2
哪里
时间差<5和
时间差>=-2和
ABS(df1.lat-df2.lat)<.02和
ABS(df1.lng-df2.lng)<.02;
"""
currentDate,df1,df2=输入数据
result=pandasql.sqldf(q,locals())
返回结果
pool=multiprocessing.pool(multiprocessing.cpu\u count())
df=pandas.concat(pool.map(匹配,匹配数据))
pool.close()
pool.join()

输入数据matchingData是包含数据集对的元组列表。每个数据集对对应一个日期。匹配的代码应该一次将文件对拆分为16个进程。结果应该是一个包含所有日期的合并数据的Pandas数据框。

问题似乎源于在每个进程中使用sqlalchemy包和SQLite的pandasql包。为了模仿pandasql使用sqlalchemy包所做的工作,我编写了以下代码

import multiprocessing as mp
import sqlalchemy

def testing(iteration):
    print("Started for iteration {}".format(iteration))

    engine = sqlalchemy.create_engine('sqlite://', 
                                  echo = True)

    print("Created engine for iteration {}".format(iteration))

    with engine.connect() as conn:
        print("Established database connection for iteration {}".format(iteration))

pool = mp.Pool(2)
results = pool.map(testing, range(2))
pool.close()
pool.join()

Sqlalchemy成功创建了两个引擎,但只为两个引擎中的一个创建了连接。通过将sqlalchemy与MySQL而不是SQLite结合使用,可以解决这个问题。由于pandasql使用SQLite,因此不应与多处理一起使用。

问题似乎源于pandasql包在每个进程中使用sqlalchemy包和SQLite。为了模仿pandasql使用sqlalchemy包所做的工作,我编写了以下代码

import multiprocessing as mp
import sqlalchemy

def testing(iteration):
    print("Started for iteration {}".format(iteration))

    engine = sqlalchemy.create_engine('sqlite://', 
                                  echo = True)

    print("Created engine for iteration {}".format(iteration))

    with engine.connect() as conn:
        print("Established database connection for iteration {}".format(iteration))

pool = mp.Pool(2)
results = pool.map(testing, range(2))
pool.close()
pool.join()
Sqlalchemy成功创建了两个引擎,但只为两个引擎中的一个创建了连接。通过将sqlalchemy与MySQL而不是SQLite结合使用,可以解决这个问题。由于pandasql使用SQLite,因此不应与多处理一起使用