线程

 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\n'%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\n'%num 38 lock.release() 39 lock.release() 40 这种情况就是同时打开两把相同的锁之后不知道该怎么办了,此时就需要使用RLock,可以允许同时获得几个锁,打开几把锁就需要关闭几把锁 41 lock=threading.RLock() 42 '''

 

posted @ 2017-05-30 09:45  腐汝  阅读(133)  评论(0编辑  收藏  举报