簡體   English   中英

pandas中的python異步read_sql

[英]python asynchronous read_sql in pandas

我想通過將查詢拆分為4來加快從數據庫獲取數據的過程。我使用apply_async編寫了以下代碼。 但是,當使用get()時,會出現酸洗錯誤。 我該怎么辦? 非常感謝你。

from multiprocessing import Pool
pool = Pool(processes=4)
start_date = datetime.datetime(2017, 1, 1)
end_date = datetime.datetime(2017, 6, 30)
period = (end_date-start_date)/4
conn = pyodbc.connect(
    r'DRIVER={SQL Server};'
    r'SERVER=abc;'
    r'PORT=111;'
    r'DATABASE=db;'
    r'UID=abc;'
    r'PWD=xyz;'
    r'TDS_Version=7.1'
    )

for p in np.arange(start_date, end_date, period).astype(datetime.datetime):
    sql = "SELECT * FROM db where date between \'" +  str(p) +  "\' and \'" +  str(p + period) + "\'"
    res.append(pool.apply_async(lambda x: pd.read_sql(x[0], con = x[1]), ([sql, conn],)))      # runs in *only* one process
pool.close() 

res[0].get()#<-------PicklingError: Can't pickle <function <lambda> at 0x00000045566BDAE8>: attribute lookup <lambda>

您需要將連接線移動到每個子進程中:通過將連接到服務器然后發送請求的例程替換“lambda x ...”。 您無法打開單個連接並在子進程之間共享它

或者,你可以用aioodbc替換pyodbc: https//github.com/aio-libs/aioodbc這將允許你用asyncio實現你需要的東西

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM