39. Python 多线程实例 多线程锁

1.多线程

多线程和多进程的表现形式差不多

IO密集型用多线程

线程是应用程序中的最小单元

多线程的实现有两种方式:

方法一:

将要执行的方法作为参数传给Thread的构造方法(和多进程类似)

1
=  threading.Thread(target = action, args = (i,))


方法二:

从Thread继承,并重写run()

看源码:

1
2
3
4
5
=  threading.Thread
p.start()  - > _start_new_thread( self .__bootstrap, ())  - self .__bootstrap_inner()  - self .run()
try :
     if  self .__target:
         self .__target( * self .__args,  * * self .__kwargs)

所以如果重写了run,就直接调用run的函数了,如果run没有重新,就调用target函数。


举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import  threading
def  worker(n):
     print  ( "start worker{0}" . format (n))
 
class  MyThread(threading.Thread):
     def  __init__( self , args):
         super (MyThread,  self ).__init__()
         self .args  =  args
     def  run( self ):
         print  ( "start MyThread{0}" . format ( self .args))
         
if  __name__  = =  "__main__" :
     for  in  xrange ( 1 6 ):
         t1  =  threading.Thread(target = worker, args = (i,))
         t1.start()
     t1.join()
     for  in  xrange ( 6 11 ):
         t2  =  MyThread(x)
         t2.start()
     t2.join()

返回结果:

1
2
3
4
5
6
7
8
9
10
start worker1
start worker2
start worker3
start worker4
start worker5
start MyThread6
start MyThread7
start MyThread8
start MyThread9
start MyThread10


多线程锁:

写法与多进程很多都类似

通过threading.Lock()来创建锁,函数在执行的只有先要获得锁,然后执行完以后要释放锁:

1
2
3
with lock:
lock.acquire()
lock.release()


举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import  threading
import  time
 
 
def   worker(name, lock):
     with lock:
         print  ( "start {0}" . format (name))
         time.sleep( 1 )
         print  ( "end  {0}" . format (name))
 
if  __name__  = =  "__main__" :
     lock  =  threading.Lock()
     t1  =  threading.Thread(target = worker, args = ( "worker1" ,lock))
     t2  =  threading.Thread(target = worker, args = ( "worker2" ,lock))
     t1.start()
     t2.start()
     print  ( "main end" )


返回结果:

1
2
3
4
5
start worker1
main end
end  worker1
start worker2
end  worker2


由结果可知:

按依次的顺序来执行,谁先获得这个锁以后谁先来执行,当他执行完毕后,将锁释放掉,下一个函数来执行的时候,才能够获得锁来执行。


本文转自 听丶飞鸟说 51CTO博客,原文链接:http://blog.51cto.com/286577399/2050404

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值