Python中的线程处理
已关闭 。这个问题是基于观点的。它当前不接受答案。
想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。
6年前关闭。
在Python中用于编写多线程应用程序的模块有哪些?我知道该语言以及Stackless
Python提供的基本并发机制,但是它们各自的优缺点是什么?
-
为了增加复杂度:
使用穿线模块
优点:
- 在自己的线程中运行任何函数(实际上是任何可调用的)真的很容易。
- 共享数据不是一件容易的事(锁从不容易:),至少很简单。
缺点:
- 正如Juergen所提到的, Python线程实际上不能并发访问解释器中的状态(有一个大锁,臭名昭著的Global Interpreter Lock。)实际上,这意味着线程对于I / O绑定任务(网络,写入磁盘,等等),但对于并发计算根本没有用。
使用多重处理模块
在简单的用例中,
threading
除了每个任务都是在自己的进程而不是自己的线程中运行之外,这与使用完全一样。(几乎从字面上看:如果您以Eli的示例为例,并threading
用multiprocessing
,,替换Thread
为Process
,并且Queue
(模块)替换为multiprocessing.Queue
,则应该可以正常运行。)优点:
- 所有任务的实际并发(无全局解释器锁定)。
- 可以扩展到多个处理器,甚至可以扩展到多 台机器 。
缺点:
- 进程比线程慢。
- 进程之间的数据共享比线程复杂。
- 内存不是隐式共享的。您要么必须明确共享它,要么必须腌制变量并将其来回发送。这更安全,但更困难。(如果越来越重要,Python开发人员似乎正在朝这个方向努力。)
使用事件模型,例如Twisted
优点:
- 您可以很好地控制优先级,执行时间。
缺点:
- 即使有了一个好的库,异步编程通常也比线程编程难,无论是在理解应该发生的事情还是在调试实际发生的事情上都很难。
在 所有
情况下,我假设您已经了解了多任务处理中的许多问题,尤其是如何在任务之间共享数据的棘手问题。如果由于某种原因您不知道何时以及如何使用锁和条件,则必须从这些开始。多任务代码充满了微妙之处和技巧,在开始之前最好对概念有一个很好的了解。