为什么我们需要 Python 中的线程?

问题描述 投票:0回答:1

GIL 是全局解释器锁。在某些程序中,它只允许一个线程在此刻工作。如果我们执行未连接到解释器的内容(例如,如果我们等待来自服务器的响应),则可以在线程中并行执行

让我们看看异步编程。 一个协程正在执行,它在我们调用

await <awaitable>
后切换上下文。在那个地方我们切换上下文并且
<awaitable>
正在执行。 看起来这个想法是一样的,除了在协程中我们选择自己切换上下文的地方。 协程不能并行工作,但它们会等待
<awaitable>
。协程和线程似乎有类似的机会。

  1. 如果它们通常不并行工作,为什么我们称它为线程?为什么我们需要 Python 中的线程?

  2. 什么时候使用多线程比异步编程更好?

python multithreading asynchronous gil
1个回答
0
投票
  1. 为什么...线程?

线程不仅仅用于并行计算。线程是 并发 执行不同活动的一种方式,而并行计算只是需要并发的一个原因。

Python 中线程的一个用例是多客户端网络服务,其中为每个不同的客户端创建不同的线程。这些线程都可以同时wait他们客户的下一个请求。它不会比单线程服务表现得更好,但有些人认为代码比单线程版本更容易阅读。单线程版本必须为每个不同的客户端保留一个显式状态对象,并且它必须有一个“调度”例程,将每个传入请求与适当的状态对象相匹配。多线程版本的代码读起来更像是单客户端服务的代码,因为大多数客户端状态都隐式存储在为其服务的线程的局部变量中。它看起来*更像是我们刚开始时都学会编写的简单、顺序的代码。

* 看起来更像是......更容易阅读,但更难write不犯严重错误。

  1. 什么时候使用多线程比异步更好?

我不知道。也许永远不会。并发的“多线程”模型比“异步”模型存在的时间长得多。我对所谓的“异步”没有太多经验,而我确实有过它的早期版本。也不在 Python 中。那时,我很难理解为什么它不只是被称为“线程”。也许比我有更多经验的人可以给你一个正确的答案。

© www.soinside.com 2019 - 2024. All rights reserved.