我读到我不应该在多线程应用程序中使用相同的数据库上下文。
所以这是我的情况:我每年运行2个函数,每个函数根据行数多次调用子函数。
这里的目标是:如果有新记录,请将其添加到数据库中,否则更新记录的某些字段。
我要做的是:
1- import pandas as pd
i=1
try:
def fecth_details(category):
global i
list01=["orange", "apple", "bananna"]
list02 = ["Tiger", "Hari", "Likun"]
list03 = ["r1", "r2", "r3"]
df1 = pd.DataFrame(list01, columns=["List of {}".format(category)])
df2 = pd.DataFrame(list02, columns=["List of {}".format(category)])
df3 = pd.DataFrame(list03, columns=["List of {}".format(category)])
writer = pd.ExcelWriter("output.xlsx")
df1.to_excel(writer,startcol=i,sheet_name="sh1", index=False)
df2.to_excel(writer,startcol=i, sheet_name="sh2", index=False)
df3.to_excel(writer,startcol=i, sheet_name="sh3", index=False)
writer.save()
i+=1
except Exception as e:
print("Error ::: {}".format(e))
category = ["fruits", "name", "rooms"]
for i in range(len(category)):
fecth_details( category[i])
将所需的POCO类缓存到列表中。 (我之所以这样做,是因为我认为从缓存上下文中检查记录要比在dbcontext上多次使用linq更快。
2-我运行以下代码。在其中,我将数据与缓存的数据进行比较
await StaticSettings.CACHED_DATA.FillAll();
3-完成所有任务后,我打电话来保存更改并处置对象。
await GetAllData(cookie, datTypes.Select(x => x.DMT_CODE).ToList(), "me", year.Y_YEAR);
await GetAllData(cookie, datTypes.Select(x => x.DMT_CODE).ToList(), "they", year.Y_YEAR);
所以我想知道的是,我是否可以依靠此代码。
await StaticSettings.CACHED_DATA.ProcessTasks(); //Saves
更新
Trace.WriteLine($@"Caching data");
await StaticSettings.CACHED_DATA.FillAll();
Trace.WriteLine($@"Caching done");
var ts = years.Select(year => Task.Run(async () =>
{
Trace.WriteLine($"Login Start {year.Y_YEAR}");
var cookie = await MahkemeWebUtils.ForceLoginWebClient(user.MU_USERNAME, user.MU_PASSWORD);
Trace.WriteLine($"Login End {year.Y_YEAR}");
await GetAllData(cookie, datTypes.Select(x => x.DMT_CODE).ToList(), "me", year.Y_YEAR);
await GetAllData(cookie, datTypes.Select(x => x.DMT_CODE).ToList(), "they", year.Y_YEAR);
//GC.Collect();
}))
.ToList();
await Task.WhenAll(ts);
await StaticSettings.CACHED_DATA.ProcessTasks(); //Saves