为了增加复杂度:

使用穿线模块

优点:

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

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

缺点:

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

使用多重处理模块

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

优点:

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

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

缺点:

进程比线程慢。

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

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

使用事件模型,例如Twisted

优点:

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

缺点:

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

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