这里会显示出您选择的修订版和当前版本之间的差别。
— |
python-basic:threading [2014/05/11 14:28] (当前版本) |
||
---|---|---|---|
行 1: | 行 1: | ||
+ | ====== Python多线程thread与threading实现 ====== | ||
+ | python是支持多线程的,并且是native的线程。主要是通过thread和threading这两个模块来实现的。 | ||
+ | |||
+ | python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用。 | ||
+ | |||
+ | 这里需要提一下的是python对线程的支持还不够完善,不能利用多CPU,但是下个版本的python中已经考虑改进这点,让我们拭目以待吧。 | ||
+ | |||
+ | threading模块里面主要是对一些线程的操作对象化了,创建了叫Thread的class。 | ||
+ | |||
+ | 一般来说,使用线程有两种模式,一种是创建线程要执行的函数,把这个函数传递进Thread对象里,让它来执行;另一种是直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的 class里。 | ||
+ | |||
+ | 我们来看看这两种做法吧。 | ||
+ | |||
+ | ===== Python thread实现多线程 ===== | ||
+ | |||
+ | <code python> | ||
+ | #-*- encoding: gb2312 -*- | ||
+ | import string, threading, time | ||
+ | |||
+ | def thread_main(a): | ||
+ | global count, mutex | ||
+ | # 获得线程名 | ||
+ | threadname = threading.currentThread().getName() | ||
+ | | ||
+ | for x in xrange(0, int(a)): | ||
+ | # 取得锁 | ||
+ | mutex.acquire() | ||
+ | count = count + 1 | ||
+ | # 释放锁 | ||
+ | mutex.release() | ||
+ | print threadname, x, count | ||
+ | time.sleep(1) | ||
+ | | ||
+ | def main(num): | ||
+ | global count, mutex | ||
+ | threads = [] | ||
+ | | ||
+ | count = 1 | ||
+ | # 创建一个锁 | ||
+ | mutex = threading.Lock() | ||
+ | # 先创建线程对象 | ||
+ | for x in xrange(0, num): | ||
+ | threads.append(threading.Thread(target=thread_main, args=(10,))) | ||
+ | # 启动所有线程 | ||
+ | for t in threads: | ||
+ | t.start() | ||
+ | # 主线程中等待所有子线程退出 | ||
+ | for t in threads: | ||
+ | t.join() | ||
+ | | ||
+ | | ||
+ | if __name__ == '__main__': | ||
+ | num = 4 | ||
+ | # 创建4个线程 | ||
+ | main(4) | ||
+ | </code> | ||
+ | |||
+ | ===== Python threading实现多线程 ===== | ||
+ | <code python> | ||
+ | #-*- encoding: gb2312 -*- | ||
+ | import threading | ||
+ | import time | ||
+ | |||
+ | class Test(threading.Thread): | ||
+ | def __init__(self, num): | ||
+ | threading.Thread.__init__(self) | ||
+ | self._run_num = num | ||
+ | | ||
+ | def run(self): | ||
+ | global count, mutex | ||
+ | threadname = threading.currentThread().getName() | ||
+ | | ||
+ | for x in xrange(0, int(self._run_num)): | ||
+ | mutex.acquire() | ||
+ | count = count + 1 | ||
+ | mutex.release() | ||
+ | print threadname, x, count | ||
+ | time.sleep(1) | ||
+ | |||
+ | if __name__ == '__main__': | ||
+ | global count, mutex | ||
+ | threads = [] | ||
+ | num = 4 | ||
+ | count = 1 | ||
+ | # 创建锁 | ||
+ | mutex = threading.Lock() | ||
+ | # 创建线程对象 | ||
+ | for x in xrange(0, num): | ||
+ | threads.append(Test(10)) | ||
+ | # 启动线程 | ||
+ | for t in threads: | ||
+ | t.start() | ||
+ | # 等待子线程结束 | ||
+ | for t in threads: | ||
+ | t.join() | ||
+ | </code> | ||
+ | |||
+ | ===== 参考 ===== | ||
+ | * https://medium.com/building-things-on-the-internet/40e9b2b36148 | ||
+ | |||
+ | ==== python thread/threading 的实现 ==== | ||
+ | |||
+ | [[http://book.csdn.net/bookfiles/749/|Python源码剖析——深度探索动态语言核心技术 ]] 第15章 第15章 PYTHON多线程机制 | ||
+ | |||
+ | |||
+ |