gpt4 book ai didi

python-3.x - 使用异步和线程

转载 作者:行者123 更新时间:2023-12-02 20:43:13 25 4
gpt4 key购买 nike

在同一个 python 项目中同时使用 asyncio 和线程以便代码在不同的线程中运行是否有意义,其中一些 asyncio 用于获取异步事件的顺序查找代码?

或者尝试这样做是否意味着我缺少一些关于使用线程或异步的基本概念?

最佳答案

我不明白你在问什么(关于“顺序查找异步事件的代码”的部分),但由于没有答案,我会写一些想法。

让我们谈谈为什么我们需要 asyncio/threads。想象一下,我们有一个任务要发出两个请求。

  1. 如果我们将使用普通的单线程非异步代码,我们唯一的选择是请求一个 url 并且只有在它完成之后 - 对于另一个:

    request(url1)
    request(url2)

    这里的问题是我们做的工作效率低下:每个函数在其执行的大部分时间里什么都不做,只是等待网络结果。如果我们能够以某种方式将 CPU 用于第二个请求,而第一个请求卡在网络中并且不需要它,那将会很酷。

  2. 这个问题可以通过在不同的线程中运行函数来解决(通常是解决):

    with ThreadPoolExecutor(max_workers=2) as e:
    e.submit(request, url1)
    e.submit(request, url2)

    这样我们会更快地得到结果。当第一个请求被网络卡住时,CPU 将能够在另一个线程中为第二个请求做一些有用的事情。

    但这不是理想的解决方案:线程之间的切换有一些成本,执行流程比第一个示例更复杂。

    应该有更好的方法。

  3. 使用一个函数空闲时间开始执行另一个函数是 asyncio 的一般含义:

    await asyncio.gather(
    async_request(url1),
    async_request(url2),
    )

    事件循环管理执行流程:当第一个协程执行某些 I/O 操作并且 CPU 可用于在其他地方执行作业时,第二个协程启动。稍后事件循环返回以继续执行第一个协程。

    我们得到“并行”请求和清晰易懂的代码。由于我们在单线程中进行了并行化,因此我们不需要另一个线程。

其实,当我们使用asyncio线程的时候还是很有用的。如果我们准备好为他们付款,他们可以help我们可以非常快速地将同步 I/O 函数转换为异步函数:

async def async_request(url):
loop = asyncio.get_event_loop()
return (await loop.run_in_executor(None, request, url))

但同样,它是可选的,我们通常可以找到模块在没有线程的情况下异步发出请求(和其他 I/O 任务)。

当线程在异步程序中很有用时,我没有遇到任何其他任务。

关于python-3.x - 使用异步和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45414050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com