Python 多线程
2017-03-06 16:36
363 查看
Threading
Python的标准库提供了两个模块:thread和threading,thread是低级模块,threading是高级模块,对thread进行了封装。绝大多数情况下,我们只需要使用threading这个高级模块。启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行:
import time,threading def loop(): print 'thread %s is running...'%threading.current_thread().name n = 0 while n<5: n= n+1 print 'thread %s >>> %s'%(threading.current_thread().name,n) time.sleep(1) print 'thread %s end.' %threading.current_thread().name print 'thread %s in running...' % threading.current_thread().name t = threading.Thread(target = loop,name = 'LoopThread') t.start() t.join() print 'thread %s end.' %threading.current_thread().name
输出结果:
thread MainThread is running…
thread LoopThread is running…
thread LoopThread >>> 1
thread LoopThread >>> 2
thread LoopThread >>> 3
thread LoopThread >>> 4
thread LoopThread >>> 5
thread LoopThread ended.
thread MainThread ended.
由于任何进程默认就会启动一个线程,我们把该线程称为主线程,主线程又可以启动新的线程,Python的threading模块有个current_thread()函数,它永远返回当前线程的实例。主线程实例的名字叫MainThread,子线程的名字在创建时指定,我们用LoopThread命名子线程。名字仅仅在打印时用来显示,完全没有其他意义,如果不起名字Python就自动给线程命名为Thread-1,Thread-2……
Lock
import threading # 3.lock # 假定这是你的银行存款: balance = 0 lock = threading.Lock() def change_it(n): # 先存后取,结果应该为0: global balance balance = balance + n balance = balance - n def run_thread(n): for i in range(100000): lock.acquire() try: change_it(n) finally: lock.release() t1 = threading.Thread(target=run_thread, args=(5,)) t2 = threading.Thread(target=run_thread, args=(8,)) t1.start() t2.start() t1.join() t2.join() print balance
Queue
from random import randint from time import sleep from Queue import Queue from myThread import MyThread def writeQ(queue): print 'producing object for Q...', queue.put('xxx', 1) print "size now", queue.qsize() def readQ(queue): val = queue.get(1) print 'consumed object from Q... size now', \ queue.qsize() def writer(queue, loops): for i in range(loops): writeQ(queue) sleep(randint(1, 3)) def reader(queue, loops): for i in range(loops): readQ(queue) sleep(randint(2, 5)) funcs = [writer, reader] nfuncs = range(len(funcs)) def main(): nloops = randint(2, 5) q = Queue(32) threads = [] for i in nfuncs: t = MyThread(funcs[i], (q, nloops), \ funcs[i].__name__) threads.append(t) for i in nfuncs: threads[i].start() for i in nfuncs: threads[i].join() print 'all DONE' if __name__ == '__main__': main()
>
starting writer at: Mon Mar 06 16:34:51 2017
add for Q… size now= 1
starting reader at: Mon Mar 06 16:34:51 2017
sub from Q… size now= 0
add for Q… size now= 1
sub from Q… size now= 0
add for Q… size now= 1
add for Q… size now= 2
writer finished at: Mon Mar 06 16:34:57 2017
sub from Q… size now= 1
sub from Q… size now= 0
reader finished at: Mon Mar 06 16:35:06 2017
all DONE
参考文献:
http://www.tuicool.com/articles/vqQNbiz
相关文章推荐
- Python 多线程端口扫描软件
- python 进行多线程编程,使用Semaphore控制线程数
- 使用Python多线程抓取并验证代理
- Python多线程 简明例子
- python多线程
- Python多线程使用2009-12-30
- python 多线程时,urllib2的古怪问题
- Python中socket和多线程的应用
- python 多线程
- 发一个python写的多线程 代理服务器 抓取,保存,验证程序,希望喜欢python的朋友和我一起完善它
- C++多线程中调用python api函数
- python多线程例子2
- Python里的多线程
- C++多线程中调用python api函数
- python 多线程 XML RPC的实现
- C++多线程中调用python api函数
- C++多线程中调用python api函数
- python多线程
- 07-爬虫的多线程调度 | 01.数据抓取 | Python
- python 多线程