python多线程如何设置同一时段只有一个线程操作数据库的某个表

python多线程如何设置同一时段只有一个线程操作数据库的某个表

问题描述:

如题,有5个线程,要共享mysql数据库里的某个表,一个线程增加了数据库里某张表的数据后,另外一个线程要视增加了数据后的表格来进行下一步操作

所以是用threading里的lock,还是Event?还是condition?

 

想要实现“同一时段只有一个线程操作数据库”,使用threading里的lock就可以实现。Event使用场景是这样的:事件发生前,线程会调用wait() 方法阻塞自己,一旦事件发生,会唤醒所有调用 wait( ) 而进入阻塞状态的线程。和线程锁相比,条件(Condition)更侧重于线程间的联络,有点类似于小朋友们的捉迷藏 游戏。另外,也可以考虑使用MySQL的锁来实现。

下面的代码,是一个使用线程锁的例子。假设有这样一个需求:在一个几百人的微信群里统计喜欢使用 PyCharm 的人数。有人说, 那就从 1 开始报数吧,并发了起始数字 1,立马有人发了数字 2、3……但是统计很快就进行不 下去了,因为大家发现有好几个人发 4,有更多的人发 5。 这就是典型的资源竞争冲突:统计用的计数器就是唯一的资源,很多人(子线程)都想取 得写计数器的资格。怎么办呢? Lock(互斥锁)就是一个很好的解决方案。Lock 只能有一个线 程获取,且获取该锁的线程才能执行,否则就会阻塞;获取该锁的线程执行完任务后,必须释放锁。

import time
import threading

lock = threading.Lock() # 创建互斥锁
counter = 0 # 计数器

def hello():
    """线程函数"""
    
    global counter
    
    if lock.acquire(): # 请求互斥锁,如果被占用,则阻塞,直至获取到锁
        time.sleep(0.2) # 假装思考、敲键盘,需要0.2秒钟
        counter += 1
        print('我是第%d个'%counter)
    
    lock.release() # 千万不要忘记释放互斥锁,否则后果很严重

def demo():
    threads = list()
    for i in range(30): # 假设群里有30人,都喜欢使用PyCharm
        threads.append(threading.Thread(target=hello))
        threads[-1].start()
    
    for t in threads:
        t.join()
    
    print('统计完毕,共有%d人'%counter)

if __name__ == '__main__':
    demo()

运行结果:

我是第1个
我是第2个
我是第3个
我是第4个
我是第5个
我是第6个
我是第7个
我是第8个
我是第9个
我是第10个
我是第11个
我是第12个
我是第13个
我是第14个
我是第15个
我是第16个
我是第17个
我是第18个
我是第19个
我是第20个
我是第21个
我是第22个
我是第23个
我是第24个
我是第25个
我是第26个
我是第27个
我是第28个
我是第29个
我是第30个
统计完毕,共有30人

请按任意键继续. . .

试试queue?