羽中飞人 2021-05-31 18:31 采纳率: 52.2%
浏览 158
已采纳

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

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

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

 

  • 写回答

2条回答 默认 最新

  • 天元浪子 Python领域优质创作者 2021-05-31 21:29
    关注

    想要实现“同一时段只有一个线程操作数据库”,使用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人
    
    请按任意键继续. . .
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题