目录

  1. 多线程创建
  2. 线程锁
  3. ThreadLocal
  4. map 实现多线程
  5. python 多线程缺陷
  6. 参考资料

多线程创建

def target():
    print 'current threading: %s is running' % threading.current_thread().name
    time.sleep(1)
    print 'current threading: %s is ended' % threading.current_thread().name

print 'current threading: %s is running' % threading.current_thread().name
t = threading.Thread(target=target)
t.setDaemon(True)
t.start()
t.join()
print 'current threading: %s is ended' % threading.current_thread().name
  • t.start()
    启动线程

  • t.join()
    阻塞当前线程,即使当前线程已经结束,也不会退出。上例中,thread-1 结束后主线程才会结束。
    如果不加 join 语句,主线程不会等待子线程结束后再退出,而是立即退出,但并不会杀死子线程。

  • t.setDaemon(True)
    设置这个之后,如果不加 join,那么主线程结束后会立即退出,并立即杀死子线程。
    可以使用 join(int) 等待一段时间,那么主线程会等待一段时间再退出。

线程锁

lock = threading.Lock()

在需要的时候 acquire(),使用后通过 release() 释放。

lock.acquire()
try:
    a += 3
finally:
    lock.release()

ThreadLocal

线程局部变量,Flask 基于此原理。

local = threading.local()
def func(name):
    local.name = name
    print "%s in %s" % (local.name, threading.current_thread().name)

t1 = threading.Thread(target=func, args=('xiaoming',))
t2 = threading.Thread(target=func, args=('xiaohong',))
t1.start()
t1.join()
t2.start()
t2.join()

map 实现多线程

urls = ['http://www.baidu.com','http://www.sina.com','http://www.qq.com']
results=map(urllib2.urlopen,urls)

map 函数负责将线程分给不同的 CPU。

python 中,有两个标准库包含 map 函数,分别是 multiprocessing 和 multiprocessing.dummy。
区别:multiprocessing 作用于进程,dummy 作用于线程。

import urllib2
from multiprocessing.dummy import Pool as ThreadPool

urls = ['http://www.baidu.com','http://www.sina.com','http://www.qq.com']

pool = ThreadPool()

results = pool.map(urllib2.urlopen,urls)
print results
pool.close()
pool.join()

print 'main ended'
  • pool = ThreadPool()
    创建线程池,默认值为 CPU 的核心数。可以自己手动指定,该数值并非越大越好,因为切换线程时会很消耗资源。

  • result = pool.map(urllib2.urlopen, urls)
    将不同的 url 传递给不同的线程,并把执行结果返回到 result 中。

python 多线程缺陷

python 中存在一个 GIL,全局解释器锁,该锁的存在保证同一时间只有一个线程执行任务,也就是说,python 的多线程并非真正的并发,而是交替执行。

参考资料

  • https://segmentfault.com/a/1190000000414339
  • http://python.jobbole.com/85050/
  • http://zhuoqiang.me/python-thread-gil-and-ctypes.html