在Python中,我试图运行一个进程(将大量数据存储到数据库)作为后台进程,它不应该等待返回当前执行函数的响应。我尝试了下面的代码。但它并没有达到我的预期。
async def import_and_background_task(myobj):
asyncio.ensure_future(myobj.storeDataToDb())
def exectuteReport():
myobj.readInputFile()
myobj.readDatafromDb()
myobj.generateReport()
# myobj.storeDataToDb()
asyncio.run(import_and_background_task(myobj))
print('its done')
return {success:True}
storeDataToDb
函数的示例定义是,
def storeDataToDb():
count = 0
while count < 5:
print('storing set {} of data to db'.format(count))
count += 1
time.sleep(2) # Delays for 2 seconds. You can adjust as needed.
我期望它会立即返回 {success:True} 而不是等待打印
storing set {} of data to db
。但正在等待完成storeDataToDb
的所有作品。如何将 storeDataToDb 函数作为后台进程运行?
像这样使用线程:
from threading import Thread
t = Thread(target=myobj.storeDataToDb)
t.start()
请记住,如果 Python 中的大部分代码都是 CPU 密集型的,那么最好使用进程,但是对于上面提到的类来说,这会变得更加困难。我不认为这是问题,因为将数据存储到数据库主要是 IO。
如果它在代码中多次发生,我建议使用 concurrent.futures 来实现更多的鲁棒执行器和任务排队。