多处理器管理器关闭会导致错误访问被拒绝

时间:2017-01-26 18:14:22

标签: python python-2.7 sqlite multiprocessing ipc

我有一个在sqlite数据库中运行多个表的函数。它读取数据,执行一些操作,然后将结果保存在csv文件中。

from __future__ import division

import sqlalchemy as sql
import pandas as pd
import os
import multiprocessing as mp

dst = r'H:\Results'

eng = sql.create_engine('sqlite:///Y:/Database/some.db') # database on external drive
con = eng.connect() 

def get_res(tab_name,lock):
    query_tr = """SELECT t, p, size, event, direction \
    FROM {tb} WHERE event IN (4, 5)""".format(tb=tab_name)

    df_tr = pd.read_sql_query(query_tr,con)
    # do some stuff with df_tr ...

    with lock:
        df_tr.to_csv(os.path.join(dst,'my_res.csv'), mode='a')

    return 1

我这样做并行如此

if __name__=='__main__':

    workers = mp.cpu_count()

    tables = sql.inspect(eng).get_table_names()

    man = mp.Manager()
    pool = mp.Pool(workers)
    lock = man.Lock()
    res = {tab_name: pool.apply_async(get_res,(tab_name,lock)) for tab_name in tables}
    pool.close()
    pool.join()
    man.shutdown()

奇怪的是,当函数从外部硬盘驱动器上的数据库中读取数据时,调用man.shutdown()会返回Windows Error 5: Access Denied,但绝对可以工作当数据库在计算机的硬盘上时很好。函数get_res正确执行,没有任何错误,并执行它应该做的事情。

我知道这不是很多,但有什么建议为什么会这样?

0 个答案:

没有答案