多线程加锁#yyds干货盘点#

Posted 坚韧的石头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程加锁#yyds干货盘点#相关的知识,希望对你有一定的参考价值。



1 为什么要加锁

python3多线程可以不加锁,每个多线程就自带锁

python2多线程必须加锁,多线程本身不带锁

多线程同时执行一个操作时(例如队列的get操作),队列为空时get属于异常行为,因此线程中的队列操作需要进行加锁处理,这样确保判断队列为空的时候没有get操作,这样就不会对空队列进行操作了


2 手动开关锁

#!/usr/bin/env python  

#coding:utf-8  

import threading

...  

## 创建锁

cstor_get_obj_lock =threading.Lock()

class del_obj_from_list(threading.Thread):  

    def __init__(self, bucket_name, del_obj_queue):  

        threading.Thread.__init__(self)  

        self.del_obj_queue = del_obj_queue  

        self.bucket_name = bucket_name  

    def run(self):  

            ...  

            global cstor_get_obj_lock  

            objs_list = []  

             ## 加锁

          cstor_get_obj_lock.acquire()  

             ## 队列不为空,则进行get操作

            if self.del_obj_queue.qsize() != 0 :  

                objs_list.append(Key:self.del_obj_queue.get(1,3))  

                self.del_obj_queue.task_done()  

             ## 释放锁

          cstor_get_obj_lock.release()  

...  

3 自动开关锁

#!/usr/bin/env python  

#coding:utf-8  

import time, threading  

...  

## 创建锁

cstor_get_obj_lock =threading.Lock()  

class del_obj_from_list(threading.Thread):  

    def __init__(self, bucket_name, del_obj_queue):  

        threading.Thread.__init__(self)  

        self.del_obj_queue = del_obj_queue  

        self.bucket_name = bucket_name  

    def run(self):  

            ...  

            global cstor_get_obj_lock  

            objs_list = []  

             ## 自动开关锁

         with cstor_get_obj_lock :  

                if self.del_obj_queue.qsize() != 0 :  

                    objs_list.append(Key:self.del_obj_queue.get(1,3))  

                    self.del_obj_queue.task_done()  


...  


以上是关于多线程加锁#yyds干货盘点#的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# Java | 关于synchronized相关理解

#yyds干货盘点#海量数据下如何使用多线程的导出 Excel

利用闭包实现自定义等待方法#yyds干货盘点#

2021-Java后端工程师面试指南-(并发-多线程)#yyds干货盘点#

#yyds干货盘点# 来,听我讲讲常用并发容器

#yyds干货盘点#Linux简介