现在的位置: 首页 > 综合 > 正文

使用 Python 进行线程编程

2013年10月16日 ⁄ 综合 ⁄ 共 1256字 ⁄ 字号 评论关闭

通过将线程和队列 结合在一起,可以轻松地在 Python
中完成线程编程。本文将研究同时使用线程和队列,创建一些简单但有效的模式,以解决需要并发处理的问题。

引言

对于 Python 来说,并不缺少并发选项,其标准库中包括了对线程、进程和异步 I/O
的支持。在许多情况下,通过创建诸如异步、线程和子进程之类的高层模块,Python 简化了各种并发方法的使用。除了标准库之外,还有一些第三方的解决方案,例如
Twisted、Stackless 和进程模块。本文重点关注于使用 Python 的线程,并使用了一些实际的示例进行说明。虽然有许多很好的联机资源详细说明了线程
API,但本文尝试提供一些实际的示例,以说明一些常见的线程使用模式。

全局解释器锁 (Global Interpretor Lock) 说明 Python 解释器并不是线程安全的。当前线程必须持有全局锁,以便对 Python
对象进行安全地访问。因为只有一个线程可以获得 Python 对象/C API,所以解释器每经过 100
个字节码的指令,就有规律地释放和重新获得锁。解释器对线程切换进行检查的频率可以通过 sys.setcheckinterval()
函数来进行控制。

此外,还将根据潜在的阻塞 I/O 操作,释放和重新获得锁。有关更详细的信息,请参见参考资料部分中的 Gil and Threading StateThreading
the Global Interpreter Lock

需要说明的是,因为 GIL,CPU 受限的应用程序将无法从线程的使用中受益。使用 Python 时,建议使用进程,或者混合创建进程和线程。

首先弄清进程和线程之间的区别,这一点是非常重要的。线程与进程的不同之处在于,它们共享状态、内存和资源。对于线程来说,这个简单的区别既是它的优势,又是它的缺点。一方面,线程是轻量级的,并且相互之间易于通信,但另一方面,它们也带来了包括死锁、争用条件和高复杂性在内的各种问题。幸运的是,由于
GIL 和队列模块,与采用其他的语言相比,采用 Python 语言在线程实现的复杂性上要低得多。

使用 Python 线程

要继续学习本文中的内容,我假定您已经安装了 Python 2.5 或者更高版本,因为本文中的许多示例都将使用 Python
语言的新特性,而这些特性仅出现于 Python2.5 之后。要开始使用 Python 语言的线程,我们将从简单的 "Hello World"
示例开始:

hello_threads_example

                

import threading
import datetime

class ThreadClass(threading.Thread):
def run(self):
now = datetime.datetime.now()
print "%s says Hello World at time: %s" %
(self.getName(), now)

for i in range(2):
t = ThreadClass()
t.start()

如果运行这个示例,您将得到下面的输出:

本文转自IBM Developerworks中国

      请点击此处查看全文

 

抱歉!评论已关闭.