问题描述
我正在使用AsyncIOMotorClient对mongoDb进行异步db调用.下面是我的代码.
Hi I'm using AsyncIOMotorClient for asynchronous db calls to mongoDb.Below is my code.
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()
在运行此程序时,我遇到了异常
While running this I'm getting an exception
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
在上述程序中,将在10秒后调用insertManyFn并执行插入操作.但是当它第一次调用insertMany时,我遇到了异常.
In the above program insertManyFn will be called after 10sec and do the insert operation. But when it make the first call to insertMany I'm getting an exception.
推荐答案
我已经修改了代码,并且可以正常工作.
I've modified the code and it's working.
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线程计时器,该计时器创建自己的线程以在一定时间后执行功能.因此,在此线程中,我正在获取事件循环,这不是正确的方法,应该首先获取事件循环并在其中创建计时器线程.我想这是唯一的原因.
Explanation- I'm using python threading timer, which creates own thread to execute a function after a certain time. So, inside this thread I was getting event loop which should not be the correct approach, it should be first getting the event loop and create a timer thread in it.I guess this is the only reason.
这篇关于RuntimeError:任务附加到另一个循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!