1 #!/usr/bin/env python 2 #coding:utf-8 3 4 import time 5 6 from threading import Thread 7 8 def foo(arg,v): 9 for item in range(100): 10 print item 11 time.sleep(1) 12 13 print 'before' 14 t1 = Thread(target=foo,args=('addfa',11,))#将线程与方法联系起来,两者建立关系,该格式的固定格式,前者是函数名,后者是要传递的参数,后面需要逗号,说明是个序列 15 16 t1.setDaemon(True)#在执行线程之前确定 17 #设置为后台线程或前台线程(默认Flase) 18 #如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止 19 #如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止 20 21 t1.start() 22 #print t1.getName()#获得线程的名字 23 #t1.join(5)#逐个执行每个线程,执行完毕后继续往下执行,该方法使得多线程变得无意义,加上参数之后变成先执行5个,然后再继续向下执行 24 print t1.isDaemon() 25 26 print 'after' 27 print 'after' 28 print 'after' 29 time.sleep(10) 30 31 32 33 #主线程从上往下执行,当主线程创建子线程之后,然后主线程再继续往下走,不去管子线程。就算主线程执行完了,也得等子线程执行完了才能结束程序。
自定义线程类
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 from threading import Thread 5 import time 6 7 class mythread(Thread): 8 def run(self): 9 time.sleep(10) 10 print '我是线程' 11 12 13 def bar(): 14 print 'bar' 15 16 17 t1 = mythread(target=bar())#不加参数是可以只写一个参数,自定义线程类跟不自定义的参数是不一样的 18 t1.start() 19 20 print 'over'
生产者消费者
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 from threading import Thread 5 from Queue import Queue 6 import time 7 8 class procuder(Thread):#生产者 9 #def __init__(self, group=None, target=None, name=None,args=(), kwargs=None, verbose=None): 10 #super(procuder).__init__(self, group=None, target=None, name=None,args=(), kwargs=None, verbose=None) 11 12 def __init__(self,name,queue): 13 self.__name=name 14 self.__queue=queue 15 super(procuder, self).__init__() 16 ''' 17 @:param name:生产者的名字 18 @:param queue:容器 19 ''' 20 def run(self): 21 while True: 22 if self.__queue.full(): 23 time.sleep(1) 24 else: 25 self.__queue.put('baozi') 26 print '%s 生产了一个包子'%(self.__name,) 27 #Thread.run(self) 28 29 30 31 class consumer(Thread):#消费者 32 def __init__(self,name,queue): 33 self.__name=name 34 self.__queue=queue 35 super(consumer,self).__init__() 36 ''' 37 @:param name:消费者的名字 38 @:param queue:容器 39 ''' 40 def run(self): 41 while True: 42 if self.__queue.empty(): 43 time.sleep(1) 44 else: 45 self.__queue.get() 46 print '%s 消费了一个包子' % (self.__name,) 47 #Thread.run(self) 48 49 que=Queue(maxsize=100)#队列最大存放100个数据 50 51 #三个生产者 52 laogou1=procuder('老狗1',que) 53 laogou1.start() 54 laogou2=procuder('老狗2',que) 55 laogou2.start() 56 laogou3=procuder('老狗3',que) 57 laogou3.start() 58 59 #20个消费者 60 for item in range(20): 61 name='chentao%d'%(item,) 62 temp=consumer(name,que) 63 temp.start() 64 65 66 67 68 69 70 71 72 ''' 73 print que.qsize() 74 que.put('1')#往队列放数据 75 que.put('2') 76 print que.empty() 77 print que.qsize() 78 print que.get()#一次只能拿一个参数 79 print que.get() 80 print que.empty()#看队列是否为空 81 '''
进程锁
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 import threading 5 import time 6 7 num=0 8 9 def run(n): 10 11 time.sleep(1) 12 global num 13 14 lock.acquire()#获取锁,独占cpu操作,需要操作的时候再加上锁 15 num+=1 16 print '%s '%num 17 lock.release()#释放锁 18 19 lock=threading.Lock()#加上锁 20 21 #samp=threading.BoundedSemaphore(4)#允许同时有多少个线程进去 22 23 for i in range(100): 24 t=threading.Thread(target=run,args=(i,)) 25 t.start() 26 27 ''' 28 def run(n): 29 30 time.sleep(1) 31 global num 32 global num2 33 lock.acquire() 34 num+=1 35 lock.acquire() 36 num2+=2 37 print '%s '%num 38 lock.release() 39 lock.release() 40 这种情况就是同时打开两把相同的锁之后不知道该怎么办了,此时就需要使用RLock,可以允许同时获得几个锁,打开几把锁就需要关闭几把锁 41 lock=threading.RLock() 42 '''