Python3.x RuntimeError: Event loop is closed
Python3.x RuntimeError: Event loop is closed
我在 aiohttp/asyncio 上做错了。如果我只是 运行 它一次关闭,我的以下代码工作正常,当我尝试从另一个文件中调用 run_my_job()
时,如下所示:
main.py
========================================
count = 0
batch_count = math.ceil((abc.get_count()/100))
print("there are {} batches to complete.".format(batch_count))
while count < batch_count:
print("starting batch {}...".format(count))
abc.run_my_job()
print("batch {} completed...".format(count))
count += 1
abc.py
===============================
def run_my_job(self):
self.queue_manager(self.do_stuff(all_the_tasks))
def queue_manager(self, method):
print('starting event queue')
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(method)
loop.run_until_complete(future)
loop.close()
async def async_post(self, resource, session, data):
async with session.post(self.api_attr.api_endpoint + resource, headers=self.headers, data=data) as response:
resp = await response.read()
return resp
async def do_stuff(self, data):
print('queueing tasks')
tasks = []
async with aiohttp.ClientSession() as session:
for row in data:
task = asyncio.ensure_future(self.async_post('my_api_endpoint', session, row))
tasks.append(task)
result = await asyncio.gather(*tasks)
self.load_results(result)
# goes on to load_results() method that parses json and updates the DB.
我收到这些错误:
Traceback (most recent call last):
File "C:/usr/PycharmProjects/api_framework/api_framework.py", line 37, in <module>
starting event queue
abc.run_my_job()
File "C:\usr\PycharmProjects\api_framework\api\abc\abc.py", line 77, in run_eligibility
self.queue_manager(self.verify_eligibility(json_data))
File "C:\usr\PycharmProjects\api_framework\api\abc\abc.py", line 187, in queue_manager
future = asyncio.ensure_future(method)
File "C:\Python36x64\lib\asyncio\tasks.py", line 512, in ensure_future
task = loop.create_task(coro_or_future)
File "C:\Python36x64\lib\asyncio\base_events.py", line 282, in create_task
self._check_closed()
File "C:\Python36x64\lib\asyncio\base_events.py", line 357, in _check_closed
raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed
sys:1: RuntimeWarning: coroutine 'Consumer.run_my_job' was never awaited
看看这个函数:
def queue_manager(self, method):
print('starting event queue')
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(method)
loop.run_until_complete(future)
loop.close()
这就是您安排每项工作的方式。并且,在函数结束时,关闭事件循环。因此,在第一个作业 运行s 之后,您关闭了事件循环。
如果您在那之后尝试 运行 更多作业,您显然是在尝试 运行 他们在一个封闭的事件循环中。 (而且你有 运行 进一步的工作。)因此错误:
RuntimeError: Event loop is closed
只需删除 loop.close()
,问题就会消失。
我不确定这是否足以让您的程序运行,因为您没有给我们任何接近 运行 可用示例的东西 — 另外,在您的真实代码中,run_my_job
显然是协程,但它不在您在此处发布的代码中。我在你发布的内容中没有看到任何其他明显的错误,但我不知道这意味着什么。
我在 aiohttp/asyncio 上做错了。如果我只是 运行 它一次关闭,我的以下代码工作正常,当我尝试从另一个文件中调用 run_my_job()
时,如下所示:
main.py
========================================
count = 0
batch_count = math.ceil((abc.get_count()/100))
print("there are {} batches to complete.".format(batch_count))
while count < batch_count:
print("starting batch {}...".format(count))
abc.run_my_job()
print("batch {} completed...".format(count))
count += 1
abc.py
===============================
def run_my_job(self):
self.queue_manager(self.do_stuff(all_the_tasks))
def queue_manager(self, method):
print('starting event queue')
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(method)
loop.run_until_complete(future)
loop.close()
async def async_post(self, resource, session, data):
async with session.post(self.api_attr.api_endpoint + resource, headers=self.headers, data=data) as response:
resp = await response.read()
return resp
async def do_stuff(self, data):
print('queueing tasks')
tasks = []
async with aiohttp.ClientSession() as session:
for row in data:
task = asyncio.ensure_future(self.async_post('my_api_endpoint', session, row))
tasks.append(task)
result = await asyncio.gather(*tasks)
self.load_results(result)
# goes on to load_results() method that parses json and updates the DB.
我收到这些错误:
Traceback (most recent call last):
File "C:/usr/PycharmProjects/api_framework/api_framework.py", line 37, in <module>
starting event queue
abc.run_my_job()
File "C:\usr\PycharmProjects\api_framework\api\abc\abc.py", line 77, in run_eligibility
self.queue_manager(self.verify_eligibility(json_data))
File "C:\usr\PycharmProjects\api_framework\api\abc\abc.py", line 187, in queue_manager
future = asyncio.ensure_future(method)
File "C:\Python36x64\lib\asyncio\tasks.py", line 512, in ensure_future
task = loop.create_task(coro_or_future)
File "C:\Python36x64\lib\asyncio\base_events.py", line 282, in create_task
self._check_closed()
File "C:\Python36x64\lib\asyncio\base_events.py", line 357, in _check_closed
raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed
sys:1: RuntimeWarning: coroutine 'Consumer.run_my_job' was never awaited
看看这个函数:
def queue_manager(self, method):
print('starting event queue')
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(method)
loop.run_until_complete(future)
loop.close()
这就是您安排每项工作的方式。并且,在函数结束时,关闭事件循环。因此,在第一个作业 运行s 之后,您关闭了事件循环。
如果您在那之后尝试 运行 更多作业,您显然是在尝试 运行 他们在一个封闭的事件循环中。 (而且你有 运行 进一步的工作。)因此错误:
RuntimeError: Event loop is closed
只需删除 loop.close()
,问题就会消失。
我不确定这是否足以让您的程序运行,因为您没有给我们任何接近 运行 可用示例的东西 — 另外,在您的真实代码中,run_my_job
显然是协程,但它不在您在此处发布的代码中。我在你发布的内容中没有看到任何其他明显的错误,但我不知道这意味着什么。