为了账号安全,请及时绑定邮箱和手机立即绑定

Python中的线程处理

Python中的线程处理

繁花如伊 2019-12-09 10:38:10
在Python中用于编写多线程应用程序的模块有哪些?我知道该语言以及Stackless Python提供的基本并发机制,但是它们各自的优缺点是什么?
查看完整描述

3 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

为了增加复杂度:


使用穿线模块

优点:


在自己的线程中运行任何函数(实际上是任何可调用的)真的很容易。

共享数据不是一件容易的事(锁从来都不是一件容易的事:),至少很简单。

缺点:


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

使用多重处理模块

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


优点:


所有任务的实际并发(无全局解释器锁定)。

可以扩展到多个处理器,甚至可以扩展到多台计算机。

缺点:


进程比线程慢。

进程之间的数据共享比线程复杂。

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

使用事件模型,例如Twisted

优点:


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

缺点:


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

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


查看完整回答
反对 回复 2019-12-09
  • 3 回答
  • 0 关注
  • 359 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信