python多线程
实例一:
#coding=utf-8 #导入threading模块,在thread上有优化 import threading from time import ctime import time count = 0 def test(func): global count time.sleep(1)#测试锁 if lock.acquire(1): count += 1 print "thread: %s. %s" %(func,ctime()) print 'num:%s.%s'%(count,ctime()) lock.release() ##or # with lock: # count += 1 # print "thread: %s. %s" %(func,ctime()) # print 'num:%s.%s'%(count,ctime()) if __name__ == '__main__': lock = threading.Lock() #创建threads数组 threads = [] #创建10个线程 for i in range(10): t = threading.Thread(target=test,args=(i,)) t.setDaemon(True) #开启线程 t.start() threads.append(t) for i in threads:i.join() print "all over %s" %ctime()
创建线程,使用threading.Thread()方法,调用方法target=test,args方法对test传参。创建好的线程装载到threads数组中。
线程对象有两个用来管理线程机制的方法: setDaemon 和 join
主线程启动若干个子线程后,如果需要等待所有的子线程执行完毕后继续执行主线程,这里需要用到的就是 join 方法,如果没有为子线程注册 join,则可能会出现在主线程执行完毕之前,还有很多子线程没有执行完毕,这时如果你为子线程注册了 setDaemon(True) 的话,主线程会回收此子线程;否则,主线程自己结束,子线程依旧在那执行。默认是 False,也就说主线程不会回收子线程。
setDaemon() : 设置此线程是否被主线程守护回收。默认False不回收,需要在 start 方法前调用;设为True相当于像主线程中注册守护,主线程结束时会将其一并回收。
join(): 设置主线程是否同步阻塞自己来待此线程执行完毕。如果不设置的话则主进程会继续执行自己的,在结束时根据 setDaemon 有无注册为守护模式的子进程,有的话将其回收,没有的话就结束自己,某些子线程可以仍在执行。
实例二:
# coding : uft-8 import threading, time class MyThread(threading.Thread):#使用类定义thread,继承threading.Thread def __init__(self): threading.Thread.__init__(self) def run(self):#run函数必须实现 global n, lock #多线程是共享资源的,使用全局变量 time.sleep(1) if lock.acquire():#当需要独占n资源时,必须先锁定,这个锁可以是任意的一个锁,可以使用上边定义的3个锁中的任意一个 print n , self.name n += 1 lock.release()#使用完counter资源必须要将这个锁打开,让其他线程使用 if "__main__" == __name__: n = 1 ThreadList = [] lock = threading.Lock()#只是定义一个锁,并不是给资源加锁,你可以定义多个锁,像下两行代码,当你需要占用这个资源时,任何一个锁都可以锁这个资源 lock1 = threading.Lock() for i in range(1, 200): t = MyThread() ThreadList.append(t) for t in ThreadList: t.start() for t in ThreadList: t.join()