Python中的线程处理

发布于 2021-01-29 16:08:03

已关闭 。这个问题是基于观点的。它当前不接受答案。


想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。

6年前关闭。

改善这个问题

在Python中用于编写多线程应用程序的模块有哪些?我知道该语言以及Stackless
Python
提供的基本并发机制,但是它们各自的优缺点是什么?

关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    为了增加复杂度:

    使用穿线模块

    优点:

    • 在自己的线程中运行任何函数(实际上是任何可调用的)真的很容易。
    • 共享数据不是一件容易的事(锁从不容易:),至少很简单。

    缺点:

    • 正如Juergen所提到的 Python线程实际上不能并发访问解释器中的状态(有一个大锁,臭名昭著的Global Interpreter Lock。)实际上,这意味着线程对于I / O绑定任务(网络,写入磁盘,等等),但对于并发计算根本没有用。

    使用多重处理模块

    在简单的用例中,threading除了每个任务都是在自己的进程而不是自己的线程中运行之外,这与使用完全一样。(几乎从字面上看:如果您以Eli的示例为例,并threadingmultiprocessing,,替换ThreadProcess,并且Queue(模块)替换为multiprocessing.Queue,则应该可以正常运行。)

    优点:

    • 所有任务的实际并发(无全局解释器锁定)。
    • 可以扩展到多个处理器,甚至可以扩展到多 台机器

    缺点:

    • 进程比线程慢。
    • 进程之间的数据共享比线程复杂。
    • 内存不是隐式共享的。您要么必须明确共享它,要么必须腌制变量并将其来回发送。这更安全,但更困难。(如果越来越重要,Python开发人员似乎正在朝这个方向努力。)

    使用事件模型,例如Twisted

    优点:

    • 您可以很好地控制优先级,执行时间。

    缺点:

    • 即使有了一个好的库,异步编程通常也比线程编程难,无论是在理解应该发生的事情还是在调试实际发生的事情上都很难。

    所有
    情况下,我假设您已经了解了多任务处理中的许多问题,尤其是如何在任务之间共享数据的棘手问题。如果由于某种原因您不知道何时以及如何使用锁和条件,则必须从这些开始。多任务代码充满了微妙之处和技巧,在开始之前最好对概念有一个很好的了解。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看