Python 多线程,lock ,rlock,event

1.多个线程对同一个数据进行修改时,要进行加锁

import time
import threading

summ = 0
def func():
    time.sleep(1)
    global summ
    l.acquire() #加锁
    summ += 1
    l.release() #释放锁
    print(summ)

l = threading.Lock()
for i in range(10):
    t = threading.Thread(target=func)
    t.start()

 2.RLOCK与LOCK区别

import threading
# 不能嵌套使用,必须一来一回
lock = threading.Lock()
lock.acquire()
print('1')   # 1
lock.acquire() #会产生死锁,卡在这里
print('2')
lock.release()
print('3')
lock.release()
print('over')
#可以嵌套使用,必须锁住多少次,释放多少次,不会产生死锁
rlock = threading.RLock()
rlock.acquire()
print('1')    # 1
rlock.acquire()
print('2')   # 2
rlock.release()
print('3')  # 3
rlock.release()
print('over')  # over

 3.Event是线程间通信最间的机制之一:一个线程发送一个event信号,其他的线程则等待这个信号。用于主线程控制其他线程的执行。 Events 管理一个flag,这个flag可以使用     set()设置成True或者使用clear()重置为False,wait()则用于阻塞,在flag为True之前。flag默认为False。

  • Event.wait([timeout]) : 堵塞线程,直到Event对象内部标识位被设为True或超时(如果提供了参数timeout)。
  • Event.set() :将标识位设为Ture
  • Event.clear() : 将标识伴设为False。
  • Event.isSet() :判断标识位是否为Ture。
def func(event_obj):
    print('wait')
    # print(event_obj.is_set())  # 判断标志位是什么
    event_obj.wait() #阻塞线程,直到标志位为True
    # print(event_obj.is_set())  # 判断标志位是什么
    print('excute')

event_obj = threading.Event() # 创建一个事件对象  标志位flag 默认为false
for i in range(10):
    t = threading.Thread(target=func,args=(event_obj,))
    t.start()

event_obj.clear() # 将标志位设置为false

inp = input()
if inp =='start':
    event_obj.set() #将标志位设置为True

 

posted @ 2017-05-07 19:55  1916  阅读(189)  评论(0)    收藏  举报