threading

这个模块基于较低级别的 thread 模块构建了更高层次的线程接口.

Python 使用多线程并不总是能提高应用程序的速度, 因为全局解释器锁(Global Interpreter Lock, GIL)将线程有效地限制到一个核中.

使用多线程的一个例子:

# coding:utf-8

import Queue
import threading
import urllib2
import time

from BeautifulSoup import BeautifulSoup

hosts = ['http://douban.com', 'http://douban.com', 'http://baidu.com', 
         'http://sohu.com', 'http://sina.com']

queue = Queue.Queue()
out_queue = Queue.Queue()

class ThreadUrl(threading.Thread):
    def __init__(self, queue, out_queue):
        threading.Thread.__init__(self)
        self.queue = queue
        self.out_queue = out_queue

    def run(self):
        while True:
            host = self.queue.get()
            url = urllib2.urlopen(host)
            chunk = url.read()

            self.out_queue.put(chunk)

            self.queue.task_done()


class DatamineThread(threading.Thread):
    def __init__(self, out_queue):
        threading.Thread.__init__(self)
        self.out_queue = out_queue

    def run(self):
        while True:
            chunk = self.out_queue.get()

            try:
                soup = BeautifulSoup(chunk)
                print soup.findAll(['title'])
            except Exception, e:
                print e
            finally:
                self.out_queue.task_done()

start = time.time()
def main():

    for i in range(5):
        t = ThreadUrl(queue, out_queue)
        t.setDaemon(True)
        t.start()

    for host in hosts:
        queue.put(host)

    for i in range(5):
        dt = DatamineThread(out_queue)
        dt.setDaemon(True)
        dt.start()

    queue.join()
    out_queue.join()

main()
print 'Elapsed Time: %s' % (time.time() - start)

class threading.local

表示 thread-local 数据的类. thread-local 数据是指特定于线程的数据. 要管理 thread-local 数据, 只要创建一个 local(或者子类) 的实例, 然后存储属性: mydata = threading.local() mydata.x = 1 这个实例的值对各个独立的线程是不同的.

threading.Lock()

工厂函数, 返回一个新的 primitive lock 对象.

thread

提供编写多线程程序的基本操作.

thread.start_new_thread(function, args[, kwargs]) 启动一个线程, 返回标识符. 该线程将调用 function, 使用参数 args 和 kwargs. 函数返回时线程结束, 返回值被忽略. 当函数抛出未处理异常时, 线程也将结束; 堆栈跟踪被打印除非异常是 SystemExit.

thread.get_ident()

返回当前线程的线程标识符.