首页 > 编程语言 >python3多线程-线程同步

python3多线程-线程同步

时间:2023-04-15 09:44:17浏览次数:45  
标签:name lock self acquire threading 线程 多线程 python3

1、介绍
多线程同时访问和操作同一资源,可能会造成异常。
解决办法是对资源进行限制,同一时间只允许一个线程进行访问和操作。
这里的资源,一般是指方法、函数或者代码块。即由多行代码组成,在逻辑上属于不可切分的操作。

2、线程同步
使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire 和 release 方法之间

3、Lock类
(1)类

class Lock:
    def __init__(self) -> None:

(2)初始化

lock = threading.Lock()

(3)方法

# 上锁,对python系统资源独占,当该锁释放,其他线程才可以竞争
lock.acquire()
# 释放
lock.release()
# 判断是否上锁
def locked(self) -> bool
``

4、使用示例
如果不是考虑效率,而是为了并发的效果。一般,会搭配time.sleep函数,使每个线程在结束核心任务后,进行等待状态,让其他线程竞争执行。
如果存在多个线程使用同一资源,需要对各线程中涉及到该资源的代码进行上锁和释放处理,线程等待需要写在释放后才有预期的效果。
```python
import threading
import time

lock = threading.Lock()


def run():
    arr = []
    t = threading.Thread(target=a, args=["zs", 10, arr])
    t1 = threading.Thread(target=p, args=[arr])
    t1.start()
    t.start()

    t.join()
    t1.join()


# 输出结果数组
def p(result: list):
    while True:
        lock.acquire()
        print(len(result))
        lock.release()
        time.sleep(4)


def a(name, count, result: list):
    for i in range(count):
        lock.acquire()
        print("正在添加", name + ":" + str(i))
        result.append(name + ":" + str(i))
        lock.release()
        time.sleep(3)


run()

5、使用示例2
lock锁的使用:
线程内部,只有对共享的资源操作代码进行上锁和释放锁才有意义,对非共享的资源操作代码上锁是无意义的,反而降低了多线程的效率
不同线程间,只有使用的同一个锁对象,才会实现对某共享资源的同步操作。
各线程内执行到调用lock对象的acquire()方法时,判断锁是否被释放状态。如果是释放状态,则上锁,并继续执行。如果是锁定状态,则休眠至其他线程将锁打开。

import threading
import time


class stu:
    # 同步有效,交替执行
    lock = threading.Lock()

    def __init__(self, name):
        self.name = name
        self.id = 0
        # 同步无效,各自执行,混乱
        # self.lock = threading.Lock()

    def p(self, delay):
        while self.id < 30:
            self.lock.acquire()
            print(self.name, self.id)
            self.id = self.id + 1
            time.sleep(delay)
            self.lock.release()


stu1 = stu("a")
t1 = threading.Thread(target=stu1.p, args=[2.5])
t1.start()
stu2 = stu("b")
t2 = threading.Thread(target=stu2.p, args=[2.5])
t2.start()

标签:name,lock,self,acquire,threading,线程,多线程,python3
From: https://www.cnblogs.com/wd404/p/17320557.html

相关文章

  • python3模块和相关
    1、模块为了方便管理类和函数,将其保存到不同的文件中,文件又可以存放在不同的目录下。这里的文件和目录,即python模块。(1)通过关键字import进行导入(2)一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。(3)搜索路径被存储在sys模块......
  • python3类的继承与相关
    参考:https://blog.csdn.net/zhouzhiwengang/article/details/1196776371、继承python支持类继承,在子类类名后的圆括号()中声明继承的父类,如果没有继承,则可以不加()。支持多继承,直接写入多个类名,用,分隔。如果没有指定基类,python的类会默认继承object类。object是所有python类......
  • java -- 线程(二)
    死锁死锁是指两个或两个以上的线程在执行过程中,由于竞争同步锁而产生的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程称为死锁。死锁的案例:同步代码块的嵌套创建锁对象:publicclassLock{public......
  • python3类
    1、类python中使用关键字class声明类。在类中,可以有变量和方法。2、对象变量和类变量在类中、方法外声明的变量为类变量,基于该类创建的对象共享类变量。在类中、方法中声明的变量为对象变量,属于各对象私有。对象变量一般建议在初始化方法__init__中统一声明,当然,在其他方法中......
  • [计科]多进程和多线程的程序在使用上有何区别?
    区别多进程和多线程的程序在使用方式和效果上有很大的区别。多进程程序是在不同的进程之间进行协作的,每个进程都有自己独立的内存空间和系统资源。多个进程之间通过进程间通信(IPC)进行数据和信息的交换。多进程的优点在于可靠性和鲁棒性较高,一个进程出现问题不会影响到其它进程......
  • python3控制结构
    1、介绍控制结构一般为:顺序结构,默认的从前到后执行顺序执行即是条件结构,if结构,python没有switch结构循环结构,while和for结构,以及迭代器,python不存在dowhile结构2、if结构if条件判断:passelif条件判断:passelse:pass3、while结构i=3whilei>0:......
  • python3 静态方法,类方法和普通方法
    classMyClass:@staticmethoddefstatic_method():print('静态方法')@classmethoddefclass_method(cls):print('类方法')#普通方法defnormal_method(self):print('普通方法')MyClass.stati......
  • python3 多继承时,父类有相同一个函数的选择
    classPeople:name=''age=0__weight=0def__init__(self,name,age,weight):print("People初始化")self.age=ageself.name=nameself.__weight=weightprint("People......
  • python3 各种方式连接mysql数据库
    print("python连接mysql数据库")#importmysql.connector"""#1使用mysql-connector连接mysqlimportmysql.connectormydb=mysql.connector.connect(host="localhost",user="clever",passwd="1881301"......
  • python3数据类型
    1、介绍python是解释型语言,变量不声明类型,而是由赋值进行确定,比如=之后的字面量或类型,或者形参接收的实参。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。2、标准数据类型包括数值number(int、float、bool、comlex)、字符串str、元组tuple、列表list、集合set、......