您好我使用AsyncIOMotorClient对mongoDb进行异步数据库调用。 以下是我的代码。
xyz.py
async def insertMany(self,collection_name,documents_to_insert):
try:
collection=self.database[collection_name]
document_inserted = await collection.insert_many(documents_to_insert)
return document_inserted
except Exception:
raise
def insertManyFn(self,collection_name,documents_to_insert):
try:
loop=asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop1=asyncio.get_event_loop()
inserted_documents_count = loop1.run_until_complete(self.insertMany(collection_name, documents_to_insert))
if inserted_documents_count==len(documents_to_insert):
document_to_insert={Config.DB_JOB_COLUMN:Job.job_id,Config.DB_JOB_RESULT_COLUMN:Config.DB_JOB_RESULT_SUCCESS}
loop1.run_until_complete(self.insertOne(Config.DB_JOB_COLLECTION, document_to_insert))
except Exception:
raise
xyz1.py
t=Timer(10,xyz.insertManyFn,\
(collection_name,documents_to_insert))
t.start()
在运行此操作时我遇到了异常
RuntimeError: Task <Task pending coro=<xyz.insertMany() running at <my workspace location>/xyz.py:144> cb=[_run_until_complete_cb() at /usr/lib64/python3.5/asyncio/base_events.py:164]> got Future <Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/lib64/python3.5/asyncio/futures.py:431]> attached to a different loop
在上面的程序中,insertManyFn将在10秒后调用并执行插入操作。但是当它第一次调用insertMany时,我得到了一个例外。
答案 0 :(得分:1)
根据documentation,AsyncIOMotorClient
如果您不使用默认值,则应通过ioloop。创建事件循环后尝试创建客户端:
loop=asyncio.new_event_loop()
asyncio.set_event_loop(loop)
client = AsyncIOMotorClient(io_loop=loop)
答案 1 :(得分:0)
我修改了代码并且它正在运行。
def insertManyFn(self,loop,collection_name,documents_to_insert):
try:
inserted_documents_count = loop.run_until_complete(self.insertMany(event_loop,collection_name, documents_to_insert))
if len(inserted_documents_count)==len(documents_to_insert):
document_to_insert={Config.DB_JOB_COLUMN:Job.job_id,Config.DB_JOB_RESULT_COLUMN:Config.DB_JOB_RESULT_SUCCESS}
loop1.run_until_complete(self.insertOne(Config.DB_JOB_COLLECTION, document_to_insert))
except Exception:
raise
loop=asyncio.get_event_loop()
t=Timer(10,self.xyz.insertManyFn,(loop,collection_name,documents_to_insert))
t.start()
解释 - 我使用python线程计时器,它创建自己的线程以在一定时间后执行一个函数。所以,在这个线程中我得到的事件循环不应该是正确的方法,它应该首先获取事件循环并在其中创建一个计时器线程。 我想这是唯一的原因。