相关疑难解决方法(0)

RuntimeError:此事件循环已在python中运行

我想我得到了这个错误,因为我的代码调用了asyncio.get_event_loop().run_until_complete(foo())两次.从foo()第二次调用函数开始foo().我的问题是:为什么这会成为问题?我为什么要关心这个循环在运行?


对这个问题进行了编辑,我认为这个编辑模糊了(有些人更喜欢遵循规则而不理解它们,因此从标题中删除了"非法"字样).不幸的是,这会造成混乱.

我不会对错误提出这一事实感到惊讶.我可以追溯到asyncio源头,看看这个图书馆的作者想要这样做,那里没有神秘感.令人费解的部分原因在于库的作者认为在循环已经运行时从事件循环中请求运行某些函数是非法的.

我们可以将问题简化为两个这样的调用,通过案例分析,我们将看到这三种可能性:

  1. 两种功能都不会终止.
  2. 其中一个功能最终终止.
  3. 这两个功能最终终止.

现在,是否有任何明智的行为可以解决所有三种情况?对我而言,显而易见的是,这里可能存在或可能存在多种理智行为.例如:

  1. 没有什么特别的,两个函数的执行是交错的,并且它们会像预期的那样永远运行.
  2. 循环不会将控制权返回run_until_complete()到第二个函数完成之后的第一个实例之后的代码(因此不会run_until_complete()执行后面的代码.
  3. 在最后一个函数终止之后,循环将控制权返回给第一个代码对象,该对象调用run_until_complete忽略所有其他调用站点.

现在,我可以理解这种行为可能不是每个人都想要的.但是,由于这个库决定让程序员控制启动/停止事件循环,它还应该满足这些决策的后果.使多次启动相同循环成为错误会使库代码无法执行此操作,从而降低了库利用的质量和实用性asyncio(例如,确实如此aiohttp).

python python-asyncio

25
推荐指数
6
解决办法
3万
查看次数

有没有办法从Python [Django]进行异步函数调用?

我正在创建一个Django应用程序,它对上传的文件进行各种长计算.我不想让用户等待处理文件 - 我只是想向用户显示一个页面,读取的内容类似于"正在解析文件".

如何从视图中进行异步函数调用?

可能看起来像这样的东西:

def view(request):
    ...
    if form.is_valid():
        form.save()
        async_call(handle_file)
    return render_to_response(...)
Run Code Online (Sandbox Code Playgroud)

python django asynchronous

6
推荐指数
1
解决办法
6589
查看次数

如何在循环中等待方法?

我有以下方法为我生成数据:

async def generate_url(self, video_id):
    data = await self.s3.generate_presigned_url(...video_id...)
    return data

def convert_to_json(self, urls):
    ids = [self.generate_url(url) for url in urls]
    ...
Run Code Online (Sandbox Code Playgroud)

如何正确地等待generate_urlconvert_to_json

python asynchronous async-await python-asyncio aiohttp

5
推荐指数
1
解决办法
4542
查看次数