我有一个在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
正确执行,没有任何错误,并执行它应该做的事情。
我知道这不是很多,但有什么建议为什么会这样?