python (协程/线程/进程) (三)线程同步

Thread对象 的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有acquire方法和release方法

ps:对于那些需要每次只允许一个线程操作的数据,可以将其操作放到acquire和release方法之间。

  • 对于Lock对象而言,如果一个线程连续两次进行acquire操作,那么第一次acquire之后没有release,第二次acquire将挂起线程。这会导致Lock对象永远不会release,使得死锁
  •  RLock (递归锁) 对象允许一个线程多次进行acquire操作,因为内部通过counter变量维护着线程acquire的次数。简单来说就是锁多小次解多少次
#!coding:utf-8
import threading, time, random

# lock = threading.Lock() #Lock对象
# lock.acquire()
# lock.acquire()  #产生了死琐。
# lock.release()
# lock.release()
#
# ------------------------------------------
# rLock = threading.RLock()  #RLock对象
# rLock.acquire()
# rLock.acquire() #在同一线程内,程序不会堵塞。
# rLock.release()
# rLock.release()


mylock = threading.RLock()
num = 0

class myThread(threading.Thread):
    def __init__(self, name):
        threading.Thread.__init__(self,name=name)

    def run(self):
        global num
        while True:
            mylock.acquire()
            print("%s locked, Number: %d " % (threading.current_thread().name, num))

            if num >= 4:
                mylock.release()
                print("%s released, Number: %d " % (threading.current_thread().name, num))
                break

            print('%s released, Number: %d ' % (threading.current_thread().name, num))
            num += 1

            # print('%s released, Number: %d ' % (threading.current_thread().name, num))
            mylock.release()
            time.sleep(random.random())

if __name__ == '__main__':
    thread1 = myThread('Thread_1')
    thread2 = myThread('Thread_2')

    thread1.start()
    thread2.start()

    thread1.join()
    thread2.join()



猜你喜欢

转载自blog.csdn.net/qq_19707521/article/details/107689643